Skip to content

Math - derivative combining Softmax and Cross-Entropy Loss.

Lần này chúng ta sẽ đi sâu vào bản chất toán học, chứng minh từng bước một cách chi tiết và giải thích lý do đằng sau mỗi phép biến đổi.

Chúng ta sẽ đi qua 3 phần:

  1. Chứng minh Đạo hàm của hàm Softmax.
  2. Chứng minh Đạo hàm của hàm Cross-Entropy Loss.
  3. Kết hợp cả hai bằng Quy tắc Chuỗi để có được kết quả cuối cùng.

Phần 1: Chứng minh chi tiết Đạo hàm của Softmax

Mục tiêu: Tính \(\frac{\partial \hat{y}_j}{\partial z_k}\), tức là sự thay đổi của một xác suất đầu ra \(\hat{y}_j\) khi một điểm số đầu vào \(z_k\) thay đổi một chút.

Công thức hàm Softmax: Xác suất đầu ra cho class \(j\) được tính từ tất cả các điểm số \(z\):

\[ \hat{y}_j = \frac{e^{z_j}}{\sum_{i=1}^{N} e^{z_i}} \]

Để tính đạo hàm này, chúng ta phải sử dụng Quy tắc đạo hàm của một thương (Quotient Rule):

Nếu \(f(x) = \frac{u(x)}{v(x)}\), thì

\(f'(x) = \frac{u'(x)v(x) - u(x)v'(x)}{[v(x)]^2}\).

Ở đây, \(u = e^{z_j}\)\(v = \sum_{i=1}^{N} e^{z_i}\). Phép đạo hàm sẽ khác nhau tùy thuộc vào \(j\) có bằng \(k\) hay không.

Trường hợp 1: j = k (Đạo hàm của một output theo chính input tương ứng)

Chúng ta đang tính \(\frac{\partial \hat{y}_j}{\partial z_j}\).

  1. Tính đạo hàm của tử số (\(u'\)): \(\frac{\partial u}{\partial z_j} = \frac{\partial}{\partial z_j} (e^{z_j}) = e^{z_j}\).

  2. Tính đạo hàm của mẫu số (\(v'\)):

    \(\frac{\partial v}{\partial z_j} = \frac{\partial}{\partial z_j} \left( \sum_{i=1}^{N} e^{z_i} \right) = \frac{\partial}{\partial z_j} (e^{z_1} + e^{z_2} + ... + e^{z_j} + ... + e^{z_N})\).

    Trong tổng này, chỉ có số hạng \(e^{z_j}\) là phụ thuộc vào \(z_j\). Đạo hàm của các số hạng khác bằng 0.

    Vậy, \(\frac{\partial v}{\partial z_j} = e^{z_j}\).

  3. Áp dụng vào Quy tắc thương:

\[ \begin{align*} \frac{\partial \hat{y}_j}{\partial z_j} &= \frac{(e^{z_j}) \cdot (\sum_{i} e^{z_i}) - (e^{z_j}) \cdot (e^{z_j})}{(\sum_{i} e^{z_i})^2} \\ &= \frac{e^{z_j}}{\sum_{i} e^{z_i}} \cdot \frac{\sum_{i} e^{z_i}}{\sum_{i} e^{z_i}} - \frac{e^{z_j}}{\sum_{i} e^{z_i}} \cdot \frac{e^{z_j}}{\sum_{i} e^{z_i}} \quad \text{(Tách thành hai phân số)} \\ &= \hat{y}_j \cdot 1 - \hat{y}_j \cdot \hat{y}_j \quad \text{(Nhận ra các thành phần chính là } \hat{y}_j \text{)} \\ &= \hat{y}_j (1 - \hat{y}_j) \end{align*} \]

Kết quả 1: \(\frac{\partial \hat{y}_j}{\partial z_j} = \hat{y}_j (1 - \hat{y}_j)\).

Trường hợp 2: j ≠ k (Đạo hàm của một output theo một input khác)

Chúng ta đang tính \(\frac{\partial \hat{y}_j}{\partial z_k}\).

  1. Tính đạo hàm của tử số (\(u'\)):

    \(\frac{\partial u}{\partial z_k} = \frac{\partial}{\partial z_k} (e^{z_j})\). Vì \(j \neq k\), \(e^{z_j}\) là một hằng số đối với \(z_k\). Vậy đạo hàm bằng 0.

  2. Tính đạo hàm của mẫu số (\(v'\)):

    \(\frac{\partial v}{\partial z_k} = \frac{\partial}{\partial z_k} \left( \sum_{i=1}^{N} e^{z_i} \right)\).

    Tương tự như trên, chỉ có số hạng \(e^{z_k}\) là phụ thuộc vào \(z_k\).

    Vậy, \(\frac{\partial v}{\partial z_k} = e^{z_k}\).

  3. Áp dụng vào Quy tắc thương:

\[ \begin{align*} \frac{\partial \hat{y}_j}{\partial z_k} &= \frac{(0) \cdot (\sum_{i} e^{z_i}) - (e^{z_j}) \cdot (e^{z_k})}{(\sum_{i} e^{z_i})^2} \\ &= - \frac{e^{z_j} \cdot e^{z_k}}{(\sum_{i} e^{z_i})^2} \\ &= - \left( \frac{e^{z_j}}{\sum_{i} e^{z_i}} \right) \cdot \left( \frac{e^{z_k}}{\sum_{i} e^{z_i}} \right) \quad \text{(Tách mẫu số)} \\ &= - \hat{y}_j \cdot \hat{y}_k \end{align*} \]

Kết quả 2: \(\frac{\partial \hat{y}_j}{\partial z_k} = - \hat{y}_j \hat{y}_k\).


Phần 2: Chứng minh chi tiết Đạo hàm của Cross-Entropy Loss

Mục tiêu: Tính \(\frac{\partial L}{\partial \hat{y}_k}\), tức là sự thay đổi của Loss khi một xác suất dự đoán \(\hat{y}_k\) thay đổi.

Công thức Cross-Entropy Loss:

\[ L = - \sum_{j=1}^{N} y_j \log(\hat{y}_j) \]

Ở đây, \(y_j\) là nhãn thực (ground-truth), có giá trị là 1 cho class đúng và 0 cho các class khác (one-hot encoding).

  1. Áp dụng phép đạo hàm:

    \(\frac{\partial L}{\partial \hat{y}_k} = \frac{\partial}{\partial \hat{y}_k} \left( - \sum_{j=1}^{N} y_j \log(\hat{y}_j) \right)\).

  2. Đưa đạo hàm vào trong tổng:

    \(\frac{\partial L}{\partial \hat{y}_k} = - \sum_{j=1}^{N} y_j \cdot \frac{\partial}{\partial \hat{y}_k} \left( \log(\hat{y}_j) \right)\).

  3. Phân tích đạo hàm bên trong:

    Phép đạo hàm \(\frac{\partial}{\partial \hat{y}_k} \left( \log(\hat{y}_j) \right)\) chỉ khác 0 khi \(j=k\). * Nếu \(j=k\), \(\frac{\partial}{\partial \hat{y}_k} \log(\hat{y}_k) = \frac{1}{\hat{y}_k}\). * Nếu \(j \neq k\), \(\frac{\partial}{\partial \hat{y}_k} \log(\hat{y}_j) = 0\).

  4. Rút gọn tổng:

    Do đó, toàn bộ tổng \(\sum_{j=1}^{N}\) chỉ còn lại duy nhất một số hạng tại \(j=k\). \(\frac{\partial L}{\partial \hat{y}_k} = - y_k \cdot \frac{1}{\hat{y}_k} = - \frac{y_k}{\hat{y}_k}\).

Kết quả 3: \(\frac{\partial L}{\partial \hat{y}_k} = - \frac{y_k}{\hat{y}_k}\).


Phần 3: Kết Hợp Bằng Quy Tắc Chuỗi - Điểm Hội Tụ

Bây giờ chúng ta đã có tất cả các mảnh ghép. Ta sẽ thay chúng vào công thức Quy tắc Chuỗi ban đầu:

\[ \frac{\partial L}{\partial z_k} = \sum_j \frac{\partial L}{\partial \hat{y}_j} \cdot \frac{\partial \hat{y}_j}{\partial z_k} \]

Để giải quyết tổng này, chúng ta lại tách nó thành hai phần: phần tử tại j=k và các phần tử còn lại j ≠ k. Đây là bước đi mấu chốt của phép chứng minh.

\[ \frac{\partial L}{\partial z_k} = \left( \frac{\partial L}{\partial \hat{y}_k} \cdot \frac{\partial \hat{y}_k}{\partial z_k} \right) + \sum_{j \neq k} \left( \frac{\partial L}{\partial \hat{y}_j} \cdot \frac{\partial \hat{y}_j}{\partial z_k} \right) \]
  1. Thay giá trị vào phần tử j=k:

    Sử dụng Kết quả 3 và Kết quả 1:

    \(\left( - \frac{y_k}{\hat{y}_k} \right) \cdot \left( \hat{y}_k (1 - \hat{y}_k) \right) = -y_k(1-\hat{y}_k) = -y_k + y_k \hat{y}_k\).

  2. Thay giá trị vào tổng các phần tử j ≠ k:

    Sử dụng Kết quả 3 và Kết quả 2:

    \(\sum_{j \neq k} \left( - \frac{y_j}{\hat{y}_j} \right) \cdot \left( - \hat{y}_j \hat{y}_k \right) = \sum_{j \neq k} (y_j \hat{y}_k)\).

  3. Ghép tất cả lại:

\[ \begin{align*} \frac{\partial L}{\partial z_k} &= (-y_k + y_k \hat{y}_k) + \sum_{j \neq k} y_j \hat{y}_k \\ &= -y_k + \left( y_k \hat{y}_k + \sum_{j \neq k} y_j \hat{y}_k \right) \quad \text{(Nhóm các số hạng có } \hat{y}_k \text{)} \\ &= -y_k + \hat{y}_k \left( y_k + \sum_{j \neq k} y_j \right) \quad \text{(Rút } \hat{y}_k \text{ làm nhân tử chung)} \end{align*} \]
  1. Phân tích cuối cùng:

    Hãy nhìn vào biểu thức trong ngoặc: \((y_k + \sum_{j \neq k} y_j)\). Đây chính là tổng của tất cả các phần tử trong vector ground-truth \(y\), tức là \(\sum_j y_j\). Vì \(y\) là vector one-hot, nó chỉ chứa một số 1 và còn lại là 0. Do đó, tổng của tất cả các phần tử của nó luôn luôn bằng 1.

    \[ \sum_j y_j = 1 \]
  2. Kết quả cuối cùng: Thay 1 vào biểu thức trên, ta có:

\[ \begin{align*} \frac{\partial L}{\partial z_k} &= -y_k + \hat{y}_k \cdot (1) \\ &= \hat{y}_k - y_k \end{align*} \]

Như vậy, chúng ta đã chứng minh một cách đầy đủ và chi tiết rằng gradient kết hợp là Dự đoán - Sự thật.