ajaudio / studyAUDIO-JEPA · RESEARCH NOTES
9 phút đọc · Toàn văn
Mục lục bài · 9 mục

Bài 8: mạng nơ-ron, backprop, attention, tối ưu và adaptation#

Bắt đầu · Trước: hình học

Mục tiêu và tiền đề#

Sau bài này, bạn đi được một lượt forward → backward → update; tính attention nhỏ và ghi tensor shapes; phân biệt optimizer với backprop; giải thích frozen encoder và supervised fine-tuning trong paper.

Cần logits/CE ở bài 6 và tích ma trận ở bài 7. θ\theta là tham số model; gradient ∇θL\nabla_\theta L tập hợp đạo hàm theo từng tham số. Đạo hàm đo độ nhạy cục bộ khi giữ các biến khác cố định; tự nó chưa giải thích quan hệ nhân quả của dữ liệu.

1. Một layer học điều gì?#

Affine layer u=xW+bu=xW+b tạo tổng có trọng số. Activation ϕ(u)\phi(u) tạo phi tuyến, chẳng hạn ReLU(u)=max⁡(0,u)(u)=\max(0,u). Hai affine layers liên tiếp vẫn gộp được thành một:

(xW1+b1)W2+b2=x(W1W2)+b1W2+b2.(xW_1+b_1)W_2+b_2=x(W_1W_2)+b_1W_2+b_2.

Phi tuyến mở rộng họ hàm, chẳng hạn quyết định XOR ở bài 7; kiến trúc có khả năng biểu diễn chưa đảm bảo optimizer tìm được nghiệm. S19: Deep Learning, chương 6, §§6.1 và 6.3.

CNN dùng kernel cục bộ và chia sẻ trọng số qua vị trí. Trong PyTorch Conv1d, phép cơ bản là cross-correlation, không đảo kernel như convolution DSP. Với stride 1, valid và một channel:

u[t]=b+∑rK[r]x[t+r].u[t]=b+\sum_r K[r]x[t+r].

Stride đổi bước giữa vị trí output; dilation giãn khoảng cách giữa các input mà kernel đọc. S20: Conv1d, định nghĩa và Parameters.

Ví dụ: x=[1,2,0,1]x=[1,2,0,1], K=[1,−1]K=[1,-1], b=0b=0 cho u=[−1,2,−1]u=[-1,2,-1]. Với L=12∑tu[t]2=3L=\tfrac12\sum_tu[t]^2=3, gradient theo kernel là ∂L/∂K[0]=(−1)(1)+(2)(2)+(−1)(0)=3\partial L/\partial K[0]=(-1)(1)+(2)(2)+(-1)(0)=3 và ∂L/∂K[1]=(−1)(2)+(2)(0)+(−1)(1)=−3\partial L/\partial K[1]=(-1)(2)+(2)(0)+(-1)(1)=-3. Một weight được dùng ở nhiều vị trí nên gradient cộng đóng góp từ các vị trí ấy.

Locality là inductive bias; nó chưa đảm bảo detector học đúng cue forensic. Padding, stride và pooling cũng ảnh hưởng thông tin được giữ.

2. Backprop là chain rule trên computational graph#

Với d=f(u)d=f(u) và u=g(w)u=g(w),

∂L∂w=∂L∂d∂d∂u∂u∂w.\frac{\partial L}{\partial w} =\frac{\partial L}{\partial d}\frac{\partial d}{\partial u}\frac{\partial u}{\partial w}.

Nếu một biến đi vào nhiều đường, cộng gradient từ mọi đường. Forward tính các giá trị; backward tính gradient; optimizer dùng gradient để cập nhật weights. S19: §§6.5.1–6.5.3.

Ví dụ đã giải, một mẫu giả lập: input x=2x=2, label y=1y=1; u=wx+bu=wx+b, h=ReLU⁡(u)h=\operatorname{ReLU}(u), d=vh+cd=vh+c, q=sigmoid⁡(d)q=\operatorname{sigmoid}(d), L=−ln⁡qL=-\ln q. Chọn w=0.5,b=0,v=1,c=0w=0.5,b=0,v=1,c=0, dùng CE không trọng số.

ForwardGiá trị
u=0.5×2+0u=0.5\times2+01
h=ReLU⁡(1)h=\operatorname{ReLU}(1)1
d=1×1+0d=1\times1+01
q=1/(1+exp⁡(−1))q=1/(1+\exp(-1))0.731059
L=−ln⁡qL=-\ln q0.313262

Backward bắt đầu từ ∂L/∂d=q−y≈−0.268941\partial L/\partial d=q-y\approx-0.268941. Vì u>0u>0, ReLU có đạo hàm 1 tại đây:

∂L∂v=(q−y)h=−0.268941,∂L∂c=q−y=−0.268941,\frac{\partial L}{\partial v}=(q-y)h=-0.268941,\qquad \frac{\partial L}{\partial c}=q-y=-0.268941,
∂L∂w=(q−y)v(1)x=−0.537883,∂L∂b=(q−y)v(1)=−0.268941.\frac{\partial L}{\partial w}=(q-y)v(1)x=-0.537883,\qquad \frac{\partial L}{\partial b}=(q-y)v(1)=-0.268941.

SGD với η=0.1\eta=0.1, cập nhật đồng thời từ weights cũ, cho w≈0.553788w\approx0.553788, b≈0.026894b\approx0.026894, v≈1.026894v\approx1.026894, c≈0.026894c\approx0.026894. Forward mới cho u≈1.134471u\approx1.134471, d≈1.191875d\approx1.191875, q≈0.767076q\approx0.767076 và L≈0.265169L\approx0.265169. Loss giảm trên mẫu này; ví dụ chưa chứng minh generalization.

Failure case: nếu u<0u<0, h=0h=0 và gradient về w,bw,b qua đường này bằng zero. Unit có thể không học qua ReLU nếu mọi input nó thấy đều ở vùng âm. Tại u=0u=0, ReLU không khả vi; autograd chọn quy ước. Learning rate lớn có thể overshoot; gradient nhỏ cũng chưa chứng minh model tốt trên heldout.

3. Attention: trộn token bằng trọng số phụ thuộc input#

Với HH có shape [Bbatch,Ntok,dmodel][B_{\mathrm{batch}},N_{\mathrm{tok}},d_{\mathrm{model}}], một head tạo Q=HWQ,K=HWK,V=HWVQ=HW_Q,K=HW_K,V=HW_V. Chiều cuối của Q/K là dkd_k, của V là dvd_v.

Aij=exp⁡(qi⊤kj/dk)∑lexp⁡(qi⊤kl/dk),oi=∑jAijvj.A_{ij}=\frac{\exp(q_i^\top k_j/\sqrt{d_k})} {\sum_l\exp(q_i^\top k_l/\sqrt{d_k})},\qquad o_i=\sum_jA_{ij}v_j.

Scores có shape [B,N,N][B,N,N]. Softmax chạy trên keys, riêng cho mỗi query row; output AVAV có shape [B,N,dv][B,N,d_v]. S21: Vaswani et al. (2017), §§3.2.1–3.2.2.

Q là cách token đặt câu hỏi; K là đặc trưng để ghép; V là nội dung được trộn. Đây là trực giác. Scaling bằng dk\sqrt{d_k} có động cơ từ dot product của các thành phần độc lập, mean zero, variance 1: variance tổng bằng dkd_k. Learned Q/K không bắt buộc luôn thỏa các giả định này.

Ví dụ đầy đủ hai token: dk=dv=1d_k=d_v=1, Q=[1,0]⊤Q=[1,0]^\top, K=[ln⁡3,0]⊤K=[\ln3,0]^\top, V=[2,6]⊤V=[2,6]^\top.

QK⊤=[ln⁡3000],A=[0.750.250.50.5],AV=[34].QK^\top=\begin{bmatrix}\ln3&0\\0&0\end{bmatrix}, \qquad A=\begin{bmatrix}0.75&0.25\\0.5&0.5\end{bmatrix}, \qquad AV=\begin{bmatrix}3\\4\end{bmatrix}.

Output đầu là 0.75(2)+0.25(6)=30.75(2)+0.25(6)=3. Token output đã trộn hai vị trí dù mỗi input token có thể là một patch cục bộ.

Multi-head chạy nhiều projections, concat outputs rồi output projection. Với cấu hình paper: width 768, 12 heads, head width 64, 128 tokens; Q/K/V thường có shape [B,12,128,64][B,12,128,64], scores [B,12,128,128][B,12,128,128], concat [B,128,768][B,128,768]. Đây là trace của kiến trúc chuẩn theo cấu hình báo cáo; chưa inspect runtime tensor.

1282=16,384128^2=16{,}384 cặp token mỗi head. Tăng N từ 128 lên 256 làm số cặp tăng 4 lần. Projections, MLP, batching và kernel cũng ảnh hưởng runtime nên không suy cả model chậm hơn đúng 4 lần.

Positional embedding ở bài 5 đưa vị trí vào token. Dense attention cho đường truyền giữa mọi cặp token nếu không có mask. Attention weight cao là trọng số trộn V ở một layer; chưa bằng đóng góp nhân quả của waveform vào logit cuối. V, residual, MLP và layers sau đều tham gia đường tính toán.

4. Residual, normalization và pooling nối token tới score#

Residual x+F(x)x+F(x) cho đường identity và đường học; gradient tổng có phần từ identity. LayerNorm chuẩn hóa feature dimensions như bài 5. Transformer block còn có MLP theo từng vị trí. Pre-LN/Post-LN là recipe cần đọc từ model/code; không áp thứ tự của Transformer 2017 cho mọi ViT.

Paper: 13 readouts gồm 12 blocks và final LN, mỗi readout có 128 vectors 768 chiều. Layer weights αl=softmax⁡(a)l\alpha_l=\operatorname{softmax}(a)_l cho H=∑lαlHlH=\sum_l\alpha_lH_l. Attention pooling tạo βi\beta_i trên 128 tokens rồi lấy

μ=∑iβihi,v=∑iβihi2−μ2,std=max⁡(v,ϵ).\mu=\sum_i\beta_i h_i,\qquad v=\sum_i\beta_i h_i^2-\mu^2,\qquad \mathrm{std}=\sqrt{\max(v,\epsilon)}.

Bình phương/căn thực hiện từng tọa độ; floor cụ thể phụ thuộc implementation. Với ∑iβi=1\sum_i\beta_i=1, đây là weighted population moment, không phải sample covariance chia n−1n-1. Concat mean/std thành 1.536 chiều rồi LN → Linear 256 → GELU → Dropout → Linear 2. Paper §3.2, trang 4–5; xem bản giải phẫu. PDF không đủ xác nhận floor numerical cụ thể.

Ví dụ pooling: hai giá trị 0 và 2 với β=[0.25,0.75]\beta=[0.25,0.75] cho mean 1.5, second moment 3, variance 3−1.52=0.753-1.5^2=0.75, std ≈0.866025\approx0.866025. Đổi thứ tự cả values và weights tương ứng không đổi thống kê. Tuy nhiên H đã chứa positional context, nên không suy thứ tự raw input hoàn toàn bị xóa.

5. AdamW và các quyết định tối ưu#

SGD thực hiện θ←θ−ηg\theta\leftarrow\theta-\eta g. Adam giữ moments theo từng tọa độ:

mt=β1mt−1+(1−β1)gt,vt=β2vt−1+(1−β2)gt2,m_t=\beta_1m_{t-1}+(1-\beta_1)g_t,\qquad v_t=\beta_2v_{t-1}+(1-\beta_2)g_t^2,
m^t=mt1−β1t,v^t=vt1−β2t.\hat m_t=\frac{m_t}{1-\beta_1^t},\qquad \hat v_t=\frac{v_t}{1-\beta_2^t}.

Theo API PyTorch AdamW, decoupled decay cho

θt=(1−ηtλ)θt−1−ηtm^tv^t+ϵ.\theta_t=(1-\eta_t\lambda)\theta_{t-1} -\eta_t\frac{\hat m_t}{\sqrt{\hat v_t}+\epsilon}.

Decay được áp riêng, không cộng λθ\lambda\theta vào gradient dùng để tạo moments. S22: AdamW, §2, Proposition 2 và Algorithm 2; S23: PyTorch 2.9 AdamW, algorithm. Quy ước coefficient của paper gốc và API có thể khác; công thức ở đây theo API được dẫn.

Ví dụ một bước: θ0=2,g=0.5\theta_0=2,g=0.5, β1=0.9,β2=0.999,η=0.1,λ=0.01\beta_1=0.9,\beta_2=0.999,\eta=0.1,\lambda=0.01, m0=v0=0m_0=v_0=0, và lấy ϵ=0\epsilon=0 trong toy có denominator khác zero. m1=0.05,v1=0.00025m_1=0.05,v_1=0.00025, m^1=0.5,v^1=0.25\hat m_1=0.5,\hat v_1=0.25. Adaptive step bằng 0.1, decay step bằng 0.002, nên θ1=1.898\theta_1=1.898.

Phản ví dụ Adam + L2 khác AdamW: với loss gradient bằng 0, θ0=2,η=0.1,λ=0.1\theta_0=2,\eta=0.1,\lambda=0.1 và moments zero, Adam + L2 nhận gradient tổng 0.2 và bước đầu cho θ1≈1.90\theta_1\approx1.90. AdamW với ϵ>0\epsilon>0 có adaptive step zero và decay riêng, cho 1.98. Ví dụ cô lập cơ chế, không dự báo hiệu quả training.

Warm-up tăng learning rate đầu lịch; OneCycle tăng rồi giảm; không có lịch nào tối ưu cho mọi task. Dropout có hành vi train/eval khác nhau. Gradient clipping giới hạn norm; mixed precision giảm độ chính xác của một số phép tính, và gradient scaling giúp giảm underflow. S30: tài liệu PyTorch về Dropout, clipping, AMP và OneCycle. Những recipe này điều khiển cách học; train loss thấp chưa chứng minh transfer tốt.

6. Frozen, full fine-tuning và adaptation#

Frozen encoder: head học CE trên features; encoder weights cố định. “Không có gradient”, “không cập nhật weights” và “eval mode” là các điều kiện khác nhau: dropout/BatchNorm có thể đổi hành vi hoặc state nếu không eval. Paper báo encoder frozen chạy eval và no-gradient. Head phi tuyến vẫn học nên đây không phải linear probe.

Full fine-tuning: encoder và head cùng nhận gradient CE. Đây là supervised adaptation. Continued pretraining tiếp tục objective SSL trên dữ liệu tiền huấn luyện; khác downstream CE.

EMA teacher cập nhật target weights bằng moving average; stop-gradient chặn một đường gradient. Chúng được học sâu ở lớp 3. Paper không tự thực hiện JEPA pretraining, và không dùng target branch/predictor trong downstream.

LoRA: giữ W0W_0 cố định, học ΔW=(α/r)BA\Delta W=(\alpha/r)BA, với A shape [r,din][r,d_{\mathrm{in}}], B shape [dout,r][d_{\mathrm{out}},r]; rank của update tối đa r. S24: LoRA, §4.1.

Matrix 768×768768\times768, rank 8, cần 8(768+768)=12,2888(768+768)=12{,}288 weights A/B thay vì 589.824 weights cho matrix đầy đủ. Phép đếm này chưa gồm head, biases và layers khác; chưa bảo đảm cùng EER. Có thể merge update vào matrix gốc khi inference, nhưng encoder lớn vẫn chạy. Đây là cầu nối khái niệm, chưa đề xuất hoặc chạy LoRA cho nghiên cứu mới.

Frozen model có khoảng 0,496M head parameters trainable vẫn cần forward encoder 85,4M. Ít trainable parameters giảm chi phí backward/optimizer state, không làm inference model chỉ còn 0,496M. Việc chọn regime cần protocol và bằng chứng; lớp 1 chưa chọn regime.

7. Bài tập#

  1. Vì sao hai Linear layers không activation vẫn gộp được? ReLU đổi điều đó thế nào?
  2. Trong ví dụ backprop tại u=1u=1, tính ∂L/∂x\partial L/\partial x. Có nghĩa optimizer cập nhật audio input không?
  3. Attention row weights [0.2,0.8][0.2,0.8], values [10,0][10,0] cho output gì? Có đủ để kết luận token thứ hai quyết định fake không?
  4. Với width 768, 12 heads, 256 tokens, tính head width và số cặp score mỗi head.
  5. Frozen encoder + nonlinear head khác linear probe ở đâu? JEPA pretraining cần thêm những khối nào về mặt khái niệm?
Đáp án — mở sau khi thử
  1. Gộp weights thành W1W2W_1W_2 và bias b1W2+b2b_1W_2+b_2. ReLU phụ thuộc vùng input âm/dương nên không gộp thành một affine map cố định cho mọi input.
  2. (q−y)v(1)w≈−0.134471(q-y)v(1)w\approx-0.134471. Đây là input gradient; optimizer thông thường cập nhật parameters, trừ task tối ưu input được định nghĩa riêng.
  3. Output bằng 2. Trọng số trộn V chưa là quyết định cuối; values và các khối sau còn tham gia.
  4. Head width 64; 2562=65,536256^2=65{,}536 cặp mỗi head, gấp 4 lần 1282128^2.
  5. Head có phép biến đổi phi tuyến. JEPA pretraining cần context/target construction, predictor và representation loss; target update rule tùy variant. Các khối ấy không tham gia downstream CE đã nộp.

Đào sâu tự chọn#

Kiểm gradient scalar bằng finite difference [L(w+δ)−L(w−δ)]/(2δ)[L(w+\delta)-L(w-\delta)]/(2\delta), tránh ReLU kink và δ\delta quá nhỏ. Jacobian mở rộng chain rule sang vector. Transformer là kiến trúc; JEPA là cách định nghĩa objective và đường dự đoán representation. Sau bài 8, thử ghi input, shape, loss và gradient path ở mỗi khối của paper. Đây là bài tự kiểm; học liệu viết xong chưa đồng nghĩa người học đã hoàn thành.

DỪNG LẠI & TỰ KIỂM TRA

Bạn đã giải thích được cơ chế trong bài?

↓ Bản Markdown nguyên gốcGiữ nguyên nội dung · Công thức, bảng và nguồn đầy đủ.Các chat bàn giao được mở trong Codex.

Gõ từ khóa để tìm bài học và đoạn liên quan.