คณิตศาสตร์สมัยใหม่ของการเรียนรู้เชิงลึกอธิบายสำหรับผู้ที่ไม่ใช่นักคณิตศาสตร์

ออกแบบโครงข่าย

ที่ผ่านมาเราใช้ภาพโครงข่ายเรียบง่ายที่แต่ละชั้นเชื่อมกับชั้นถัดไป แต่ปัญหาจริงมักได้ประโยชน์จากการออกแบบการเชื่อมต่ออย่างระมัดระวัง

เราจะลองหกแนวคิด: มองภาพทีละบริเวณเล็ก ๆ ส่งค่าเดิมผ่านทางลัด คืนรายละเอียดภาพ ปรับตัวเลขให้อยู่ในมาตราส่วนเดียวกัน ตัดการเชื่อมต่อ และส่งข้อมูลต่อไปตามลำดับ แต่ละแบบเปลี่ยนวิธีคำนวณของโครงข่าย

6.1 พิจารณาเฉพาะบริเวณใกล้เคียง

โครงข่ายคอนโวลูชัน · หน้าในบทความ 45–46

พิกเซลใกล้กันอาจเป็นส่วนเล็ก ๆ ของขอบภาพ ตัวกรองคือรายการน้ำหนักสั้น ๆ ที่ใช้กับค่าความสว่างใกล้กันไม่กี่ค่า โดยคูณแต่ละค่ากับน้ำหนักที่ตรงกันแล้วบวกผล

เลื่อนตัวกรองสองค่า (1, −1) ชุดเดียวกันผ่านค่าสมมติ (3, 2, 4) คูณสมาชิกที่ตรงกันแล้วบวกในแต่ละหน้าต่าง

ใช้ค่าน้ำหนักเดิมเปรียบเทียบข้อมูลใกล้เคียงกันทั้งสองตำแหน่ง

แบบจำลองอย่างง่าย

yi=w1xi+w2xi+1y_i=w_1x_i+w_2x_{i+1}
y1=3−2=1,y2=2−4=−2y_1=3-2=1,\quad y_2=2-4=-2
function neighboringDifferences(values) {
  return { outputs: [values[0] - values[1], values[1] - values[2]] };
}
const result = neighboringDifferences([3, 2, 4]);

เลือกการเปลี่ยนแปลง ทำนาย แล้วกดรัน

ผลลัพธ์:
เปิด JavaScript เพื่อรันตัวอย่างนี้

ศึกษาเพิ่มเติมในคลังแนวคิด หน้าในบทความ 45

สแกนภาพ

ตัวอย่างสมมติ

สำรวจ

เลื่อนหน้าต่างสามพิกเซลให้ได้ผลตอบสนอง 4

แตะภาพหรือใช้ปุ่ม

เครื่องสแกนเคลื่อนที่111555ค่าสุดท้าย − ค่าแรก = 0
ตำแหน่งหน้าต่าง
0

ตำแหน่ง: 0; ปัจจุบัน: 1 · 1 · 1; ผลลัพธ์: 0

เลื่อนตัวกรอง [1, −1] ชุดเดียวกันผ่านค่าที่อ่านได้ [3, 2, 4] ตำแหน่งแรกคำนวณ 1×3 − 1×2 = 1 ตำแหน่งที่สองคำนวณ 1×2 − 1×4 = −2 ตัวกรองถูกใช้ซ้ำแทนการเรียนรู้น้ำหนักคู่ใหม่ในทุกตำแหน่ง

การคำนวณเฉพาะที่ซ้ำนี้เป็นแนวคิดเบื้องหลังเครือข่ายคอนโวลูชัน ขั้นต่อมาอาจสรุปผลตอบสนองของตัวกรองที่อยู่ใกล้กันและลดขนาดภาพ ซึ่งมักเรียกว่าพูลลิง บทความศึกษาว่าการคำนวณเฉพาะที่ น้ำหนักร่วม และพฤติกรรมเมื่อรูปแบบเลื่อนตำแหน่งจำกัดฟังก์ชันที่เครือข่ายแสดงได้อย่างไร

6.2 ทางลัดระหว่างชั้น

โครงข่ายส่วนตกค้าง · หน้าในบทความ 46–47

ระหว่างการฝึก สัญญาณปรับค่าย้อนผ่านชั้นต่าง ๆ แต่ละชั้นคูณสัญญาณด้วยตัวประกอบที่บอกผลของชั้นนั้น เช่น สัญญาณ 1 ที่คูณ 0.5 สามครั้งจะเป็น 0.5 แล้ว 0.25 แล้ว 0.125 ตัวประกอบต่ำกว่า 1 หลายตัวอาจทำให้สัญญาณเล็กมาก ส่วนตัวประกอบมากกว่า 1 หลายตัวอาจทำให้ใหญ่เกินไป ทั้งสองแบบทำให้ปรับชั้นแรก ๆ ได้ยาก

บล็อกเรซิดวลเก็บค่าก่อนหน้าไว้และบวกค่าปรับแก้ แทนที่จะแทนที่ค่าทั้งหมด

แก้อุณหภูมิ

ตัวอย่างสมมติ

สำรวจ

ทำนายค่าหลังเพิ่มส่วนแก้ 2

แตะภาพหรือใช้ปุ่ม

ก่อน3°C−+สองเส้นทาง+คงไว้เพิ่ม 2°Cหลัง??
ค่าเดิม (°C)
3

ค่าเริ่มต้น: 3 °C; ส่วนแก้: 2 °C

ในชั้นตกค้างของบทความ ค่าชดเชยหลังฟังก์ชันกระตุ้นถูกบวกกับค่าชั้นก่อนหน้า ตัวอย่างนี้ใช้ค่าเดิม 3 และค่าชดเชย 1

ผลลัพธ์คือข้อมูลเข้าเดิมที่ปรับด้วยค่าชดเชย

สูตรจากบทความ

Φˉ(ℓ)(x,θ)=ϱ(Φ(ℓ)(x,θ))+Φˉ(ℓ−1)(x,θ)\bar\Phi^{(\ell)}(x,\theta)=\varrho(\Phi^{(\ell)}(x,\theta))+\bar\Phi^{(\ell-1)}(x,\theta)
3+ReLU⁡(1)=43+\operatorname{ReLU}(1)=4
function residualBlock(value, correction) {
  const activated = Math.max(0, correction);
  return { input: value, correction: activated, output: value + activated };
}
const result = residualBlock(3, 1);

เลือกการเปลี่ยนแปลง ทำนาย แล้วกดรัน

ผลลัพธ์:
เปิด JavaScript เพื่อรันตัวอย่างนี้

ศึกษาเพิ่มเติมในคลังแนวคิด หน้าในบทความ 47 (6.2)

ในสูตร Φ ที่มีขีดบนคือผลลัพธ์ชั้นตกค้าง ℓ คือหมายเลขชั้น Φ คือค่าชดเชยก่อนกระตุ้น ρ คือฟังก์ชันกระตุ้น และ θ รวมพารามิเตอร์ ในตัวอย่าง ReLU คงค่า 1 จึงได้ 3 + 1 = 4

ทางตรงยังช่วยให้สัญญาณปรับค่าย้อนกลับได้โดยไม่ต้องผ่านทุกค่าปรับแก้ บทความเชื่อมการปรับเล็ก ๆ หลายครั้งกับการอธิบายการเคลื่อนที่ด้วยการคำนวณทีละช่วงเวลาสั้น ๆ ทางลัดอาจช่วยได้ แต่ไม่รับประกันว่าการฝึกจะง่าย

6.3 แยกส่วนแล้วสร้างกลับ

เฟรมเล็ตและยูเน็ต · หน้าในบทความ 47–49

เมื่อย่อภาพ เราอาจสูญเสียรายละเอียดเล็กแต่สำคัญ เครือข่ายรูปตัวยูบีบอัดข้อมูลก่อนแล้วสร้างภาพกลับขึ้นมา การเชื่อมต่อระยะยาวสามารถนำรายละเอียดก่อนหน้ามาช่วยสร้างภาพคืน

หาค่าเฉลี่ยของพิกเซลสมมติ 2 และ 4 และเก็บผลต่างครึ่งหนึ่งไว้ ใช้ทั้งสองส่วนสร้างข้อมูลเข้ากลับคืน

การเก็บทั้งค่าเฉลี่ยและครึ่งหนึ่งของผลต่างช่วยกู้คืน 2 และ 4 ได้

ตัวอย่างคำนวณ

a=(x1+x2)/2,d=(x1−x2)/2,(x1,x2)=(a+d,a−d)a=(x_1+x_2)/2,\quad d=(x_1-x_2)/2,\quad (x_1,x_2)=(a+d,a-d)
a=3,d=−1,(a+d,a−d)=(2,4)a=3,\quad d=-1,\quad (a+d,a-d)=(2,4)
function splitAndReconstruct(first, second) {
  const average = (first + second) / 2;
  const detail = (first - second) / 2;
  const reconstructed = [average + detail, average - detail];
  return { average, detail, reconstructed };
}
const result = splitAndReconstruct(2, 4);

เลือกการเปลี่ยนแปลง ทำนาย แล้วกดรัน

ผลลัพธ์:
เปิด JavaScript เพื่อรันตัวอย่างนี้

ศึกษาเพิ่มเติมในคลังแนวคิด หน้าในบทความ 48

คืนรายละเอียดกระเบื้อง

ตัวอย่างสมมติ

สำรวจ

คืนรูป 1, 3, 1, 3 จาก 2, 2, 2, 2

แตะภาพหรือใช้ปุ่ม

ผ้าเดิม1 · 3 · 1 · 3ภาพย่อแบบหยาบ2 · 2 · 2 · 2รายละเอียดที่เลือก0 · 0 · 0 · 0 → 2 · 2 · 2 · 2รายละเอียดที่เลือก1 · -1 · 1 · -1 → 3 · 1 · 3 · 1รายละเอียดที่เลือก-1 · 1 · -1 · 1 → 1 · 3 · 1 · 3
รูปแบบรายละเอียด

รายละเอียด: ไม่มีรายละเอียด; ผลลัพธ์: 2 · 2 · 2 · 2; เป้าหมาย: 1 · 3 · 1 · 3

จากพิกเซล 2 และ 4 ค่าเฉลี่ยคือ (2 + 4)/2 = 3 และผลต่างครึ่งหนึ่งคือ (2 − 4)/2 = −1 การเก็บทั้งสองค่าช่วยให้กู้คืน 3 − 1 = 2 และ 3 + 1 = 4 ได้ ค่าเฉลี่ยเพียงอย่างเดียวจะให้ 3 สองตัวและลืมความแตกต่าง

ค่าเฉลี่ยบอกส่วนที่พิกเซลสองตัวมีร่วมกัน ส่วนผลต่างบอกความแตกต่าง บทความใช้กลุ่มรูปแบบเฉพาะที่และส่วนรวมที่หลากหลายกว่า เรียกว่าเฟรม เพื่อบรรยายภาพด้วยจำนวนที่บอกว่ามีแต่ละรูปแบบอยู่เท่าไร ภายใต้เงื่อนไขที่ระบุ จำนวนเหล่านี้ใช้สร้างภาพกลับได้

ใน U-Net การเชื่อมข้ามส่งคุณลักษณะก่อนหน้าที่มีประโยชน์ผ่านเส้นทางบีบอัด การสร้างกลับได้ตรงพอดีหรือไม่ขึ้นอยู่กับตัวกรองและสถาปัตยกรรม ไม่ใช่เพียงการวาดเป็นรูปตัวยู

6.4 ปรับตัวเลขให้เทียบกันได้

การปรับมาตรฐานแบบชุด · หน้าในบทความ 49–50

แบตช์ฝึกต่างกันอาจส่งจำนวนที่มีค่ากลางและการกระจายต่างกันไปยังชั้นหนึ่ง การทำให้เป็นมาตรฐานแบบแบตช์เปลี่ยนมาตราส่วนโดยใช้ค่าในแบตช์ปัจจุบัน แล้วใช้พารามิเตอร์มาตราส่วนและการเลื่อนที่เรียนรู้ได้

ใช้ชุดข้อมูลที่มี 1 และ 3 ก่อนอื่นหาค่าเฉลี่ย แล้ววัดการกระจายโดยยกกำลังสองระยะของแต่ละค่าจากค่าเฉลี่ย หาค่าเฉลี่ยของกำลังสองเหล่านั้น และถอดรากที่สอง

ลบค่าเฉลี่ยของกลุ่ม แล้วหารด้วยค่าการกระจายของกลุ่ม

นิยาม / กฎในบทความ

μ=1m∑ixi,σ=1m∑i(xi−μ)2,zi=xi−μσ\mu=\frac1m\sum_i x_i,\quad \sigma=\sqrt{\frac1m\sum_i(x_i-\mu)^2},\quad z_i=\frac{x_i-\mu}{\sigma}
μ=2,σ=1,(z1,z2)=(−1,1)\mu=2,\quad \sigma=1,\quad (z_1,z_2)=(-1,1)
function normalizeBatch(values) {
  if (values.length === 0) throw new Error('ชุดข้อมูลต้องไม่ว่าง');
  let total = 0;
  for (const value of values) total += value;
  const mean = total / values.length;
  let squaredTotal = 0;
  for (const value of values) squaredTotal += (value - mean) ** 2;
  const spread = Math.sqrt(squaredTotal / values.length);
  if (spread === 0) throw new Error('ส่วนเบี่ยงเบนของชุดข้อมูลต้องไม่เป็นศูนย์');
  const normalized = [];
  for (const value of values) normalized.push((value - mean) / spread);
  return { mean, spread, normalized };
}
const result = normalizeBatch([1, 3]);

เลือกการเปลี่ยนแปลง ทำนาย แล้วกดรัน

ผลลัพธ์:
เปิด JavaScript เพื่อรันตัวอย่างนี้

ศึกษาเพิ่มเติมในคลังแนวคิด หน้าในบทความ 49

เปรียบเทียบอุณหภูมิ

ตัวอย่างสมมติ

สำรวจ

ทำนายว่าค่าที่สามต่ำกว่า เท่ากับ หรือสูงกว่าค่าเฉลี่ย

แตะภาพหรือใช้ปุ่ม

ค่าที่วัดอุณหภูมิ2°C4°C6°Cค่าเฉลี่ย ?−+เทียบกับค่าเฉลี่ย↓ต่ำกว่า=เท่ากัน↑สูงกว่า?
ค่าที่สาม (°C)
6

ปัจจุบัน: 2 · 4 · 6 °C; ค่าที่สาม: 6 °C

ค่าเฉลี่ยคือ (1 + 3)/2 = 2 ลบค่านี้จากแต่ละจำนวนจะได้ผลต่าง −1 และ +1 ยกกำลังสองแล้วหาค่าเฉลี่ย: ((−1)² + 1²)/2 = 1 รากที่สองของ 1 คือ 1 ซึ่งเป็นค่าการกระจายที่เรียกว่าส่วนเบี่ยงเบนมาตรฐาน เมื่อลบ 2 แล้วหารด้วยค่าการกระจายนี้ จะได้ [−1, 1]

บทความศึกษาว่าการทำให้เป็นมาตรฐานนี้อาจเปลี่ยนวิธีที่ความสูญเสียตอบสนองเมื่อค่าตั้งเปลี่ยนอย่างไร ภายใต้บางเงื่อนไข การตอบสนองอาจเรียบขึ้นและช่วยในการหาค่าตั้ง แต่ไม่ได้รับประกันว่าแบบจำลองสุดท้ายจะดีกว่า

หากทุกค่าในแบตช์เหมือนกัน ส่วนเบี่ยงเบนมาตรฐานเป็นศูนย์ สูตรพื้นฐานหารด้วยศูนย์ไม่ได้ การใช้งานจริงเพิ่มพจน์เล็ก ๆ เพื่อความเสถียร ภาพประกอบใช้ค่าที่ไม่เหมือนกัน

6.5 ตัดการเชื่อมต่อที่ไม่จำเป็น

โครงข่ายเบาบางและการตัดแต่ง · หน้าในบทความ 50–52

เครือข่ายขนาดใหญ่อาจมีการเชื่อมต่อที่เพิ่มผลน้อยต่อผลลัพธ์หนึ่ง การตัดแต่งตั้งค่าน้ำหนักบางตัวเป็นศูนย์เพื่อให้ต้องเก็บการเชื่อมต่อน้อยลง

ผลลัพธ์สมมติบวกน้ำหนักสามตัวคูณข้อมูลเข้า ลบน้ำหนักเล็กตัวหนึ่งแล้วเปรียบเทียบผลลัพธ์กับค่าเดิม

หลังตัดน้ำหนักออก ผลลัพธ์ที่ข้อมูลเข้านี้เปลี่ยนไป 0.1

ตัวอย่างคำนวณ

y=∑iwixi,ตัดเมื่อ ∣wi∣<τy=\sum_i w_ix_i,\quad \text{ตัดเมื่อ }|w_i|<\tau
y=2+0.1+1=3.1,ypruned=2+1=3y=2+0.1+1=3.1,\quad y_{\rm pruned}=2+1=3
function pruneWeights(weights, cutoff) {
  if (!(cutoff >= 0)) throw new Error('เกณฑ์ต้องไม่ติดลบ');
  let original = 0;
  let pruned = 0;
  for (const weight of weights) {
    original += weight;
    if (Math.abs(weight) >= cutoff) pruned += weight;
  }
  return { original, pruned };
}
const result = pruneWeights([2, 0.1, 1], 0.2);

เลือกการเปลี่ยนแปลง ทำนาย แล้วกดรัน

ผลลัพธ์:
เปิด JavaScript เพื่อรันตัวอย่างนี้

ศึกษาเพิ่มเติมในคลังแนวคิด หน้าในบทความ 51

ลบเบาะแสในภาพ

ตัวอย่างสมมติ

สำรวจ

เก็บเฉพาะเบาะแสบวกที่แรงที่สุด

แตะภาพหรือใช้ปุ่ม

เบาะแสในภาพ000หู · หนวด · หูกลมคะแนนแมว0
เบาะแสที่เก็บ

ที่เลือก: ไม่มี; น้ำหนักที่เก็บ: ไม่มี; ผลลัพธ์: 0

สำหรับข้อมูลเข้าสมมติที่ทุกคุณลักษณะเท่ากับ 1 ผลย่อย 2, 0.1 และ 1 รวมเป็น 3.1 เมื่อลบผลย่อย 0.1 ได้ 3 ซึ่งต่างเพียง 0.1 สำหรับข้อมูลเข้านี้ แต่ข้อมูลเข้าอื่นอาจเปลี่ยนผลของการลบการเชื่อมต่อ

บทความพิสูจน์ว่าภายใต้สมมติฐานที่กำหนด เครือข่าย ReLU สองชั้นที่กว้างมากสามารถประมาณด้วยเครือข่ายที่เบาบางกว่ามากเมื่อปรับน้ำหนักผลลัพธ์บางตัวที่เก็บไว้ การรับประกันเกี่ยวกับความใกล้เคียงกับผลลัพธ์ของเครือข่ายเดิม ไม่ใช่ความถูกต้องเทียบกับป้ายจริงโดยอัตโนมัติ

ภาพการเชื่อมต่อเบาบางนี้เกี่ยวกับการลบน้ำหนัก ซึ่งต่างจากคำอธิบายรูปแบบเบาบางที่เราจะพบในบทที่ 7

6.6 จำข้อมูลจากขั้นก่อนหน้า

โครงข่ายเวียนเกิด · หน้าในบทความ 52

ภาพถ่ายเป็นกลุ่มพิกเซลชุดเดียว ส่วนประโยคหรือเสียงระฆังหลายครั้งมาเป็นลำดับ บางครั้งคำตอบถัดไปควรขึ้นอยู่กับสิ่งที่มาก่อน

เครือข่ายเวียนเกิดเก็บสถานะ คือจำนวนหนึ่งหรือหลายจำนวนที่นำข้อมูลจากข้อมูลเข้าก่อนหน้ามาด้วย เมื่อข้อมูลเข้าถัดไปมาถึง เครือข่ายปรับสถานะโดยใช้กฎเดียวกันทุกครั้ง

จำเสียงกริ่ง

ตัวอย่างสมมติ

สำรวจ

อ่านสามสัญญาณแรก แล้วทำนายความจำ

แตะภาพหรือใช้ปุ่ม

1: กริ่งความจำ: —2: เงียบความจำ: —3: กริ่งความจำ: —4: กริ่งความจำ: —
สัญญาณที่อ่าน
0

สัญญาณที่อ่าน: 0; ค่าเริ่มต้น:

สำหรับลำดับที่ต่างจากกิจกรรม ลองนึกถึงระฆังที่ให้ค่า 1 ทุกครั้งที่ดัง แต่ละขั้นหารสถานะก่อนหน้าด้วยสองแล้วบวกเสียงระฆังปัจจุบัน

สถานะที่สองส่งต่อค่าครึ่งหนึ่งของสถานะแรก

แบบจำลองอย่างง่าย

ht=12ht−1+xth_t=\tfrac12 h_{t-1}+x_t
h0=0,x1=x2=1:h1=1,h2=1.5h_0=0,\quad x_1=x_2=1:\quad h_1=1,\quad h_2=1.5
function recurrentStep(first, memory, nextInput) {
  const second = memory * first + nextInput;
  return { first, second };
}
const result = recurrentStep(1, 0.5, 1);

เลือกการเปลี่ยนแปลง ทำนาย แล้วกดรัน

ผลลัพธ์:
เปิด JavaScript เพื่อรันตัวอย่างนี้

ศึกษาเพิ่มเติมในคลังแนวคิด หน้าในบทความ 52

เริ่มด้วยสถานะ 0 หากเสียงระฆังบวก 1 และสถานะเก่าถูกหารสอง ขั้นแรกได้ 0/2 + 1 = 1 เมื่อระฆังดังครั้งที่สองได้ 1/2 + 1 = 1.5 จำนวน 1.5 มีข้อมูลจากทั้งสองขั้น

เพื่อฝึกกฎที่ใช้ซ้ำ เครือข่ายส่งสัญญาณปรับค่าย้อนผ่านแต่ละขั้น การคูณซ้ำอาจทำให้สัญญาณเล็กมากหรือใหญ่เกินไป จึงปรับขั้นแรก ๆ ได้ยาก สิ่งนี้เรียกว่าเกรเดียนต์หายไปหรือระเบิด บางแบบใช้ประตูควบคุมสิ่งที่สถานะเก็บไว้ แต่สถานะไม่ใช่ความทรงจำที่สมบูรณ์

การเปลี่ยนการเชื่อมต่อของโครงข่ายเปลี่ยนด้วยว่าข้อมูลใดถูกนำกลับมาใช้ เก็บรักษา หรือทิ้งไป คำถามต่อไปคือการเชื่อมต่อเหล่านี้ช่วยให้โครงข่ายเรียนรู้คุณลักษณะอะไรได้บ้าง

ลองแบบทดสอบท้ายบท

1. ตัวกรองหาขอบชนิดเดียวกันในหลายตำแหน่งของภาพได้อย่างไร?

2. บล็อกส่วนตกค้างรวมอะไร?

3. การตัดแต่งนำอะไรออก?

คำอธิบายเพื่อการศึกษาอย่างอิสระจาก คณิตศาสตร์สมัยใหม่ของการเรียนรู้เชิงลึก — จูเลียส แบร์เนอร์, ฟิลิปป์ โกรส์, กิตตา คูทินิออค, ฟิลิปป์ ปีเตอร์เซน. ตัวอย่างใช้ตัวเลขสมมติ เว้นแต่จะระบุแหล่งข้อมูลที่วัดจริง