神经网络反向传播交叉熵 损失函数对输出层激活值Z2的导数

本文是交叉熵损失函数为代表的两层神经网络的反向传播量化求导计算公式中的一个公式,单独拿出来做一下解释说明。


公式 8-13 是反向传播过程中的一个关键步骤,用于计算损失函数对输出层激活值的导数。这个公式来自于链式法则,结合了交叉熵损失函数和 sigmoid 激活函数的导数。下面我们详细解释公式 8-13 的推导过程。

公式 8-13 的表达式:

∂ L ∂ z 2 = a 2 − y \frac{\partial L}{\partial z_2} = a_2 - y z2L=a2y

其中:

  • L L L 是损失函数,具体是交叉熵损失函数 L ( y , a 2 ) L(y, a_2) L(y,a2)
  • z 2 z_2 z2 是输出层神经元的加权输入值(在应用 sigmoid 激活函数之前的值)。
  • a 2 a_2 a2 是输出层神经元的激活值,即应用 sigmoid 函数后的输出。
  • y y y 是真实标签。
  • 公式 8-13 表示的是损失函数 L L L 对输出层加权输入 z 2 z_2 z2 的导数。

推导步骤:

1. 交叉熵损失函数

交叉熵损失函数的表达式为(参考公式 8-11):
L ( y , a 2 ) = − [ y log ⁡ a 2 + ( 1 − y ) log ⁡ ( 1 − a 2 ) ] L(y, a_2) = -[y \log a_2 + (1 - y) \log(1 - a_2)] L(y,a2)=[yloga2+(1y)log(1a2)]
其中:

  • y y y 是真实的标签, a 2 a_2 a2 是模型的输出(经过 sigmoid 激活函数的输出层激活值)。

我们希望通过反向传播来计算损失函数对输出层加权输入 z 2 z_2 z2 的导数。因此,我们需要结合交叉熵损失和 sigmoid 函数进行链式求导。

2. 激活函数(sigmoid)

sigmoid 函数的定义为:
a 2 = σ ( z 2 ) = 1 1 + e − z 2 a_2 = \sigma(z_2) = \frac{1}{1 + e^{-z_2}} a2=σ(z2)=1+ez21
sigmoid 函数的导数可以通过如下推导得到:
d σ ( z 2 ) d z 2 = σ ( z 2 ) ( 1 − σ ( z 2 ) ) = a 2 ( 1 − a 2 ) \frac{d\sigma(z_2)}{dz_2} = \sigma(z_2) (1 - \sigma(z_2)) = a_2 (1 - a_2) dz2dσ(z2)=σ(z2)(1σ(z2))=a2(1a2)
其中,导数 d σ ( z 2 ) d z 2 \frac{d\sigma(z_2)}{dz_2} dz2dσ(z2) 表示激活值 a 2 a_2 a2 对加权输入 z 2 z_2 z2 的变化率。

3. 链式法则的应用

为了计算损失函数对 z 2 z_2 z2 的导数 ∂ L ∂ z 2 \frac{\partial L}{\partial z_2} z2L,我们可以利用链式法则。根据链式法则,损失函数对 z 2 z_2 z2 的导数可以表示为:

∂ L ∂ z 2 = ∂ L ∂ a 2 ⋅ ∂ a 2 ∂ z 2 \frac{\partial L}{\partial z_2} = \frac{\partial L}{\partial a_2} \cdot \frac{\partial a_2}{\partial z_2} z2L=a2Lz2a2

即:损失函数对 z 2 z_2 z2 的导数等于损失函数对 a 2 a_2 a2 的导数乘以 a 2 a_2 a2 z 2 z_2 z2 的导数。

4. 计算损失函数对 a 2 a_2 a2 的导数

根据交叉熵损失函数的公式,我们可以直接求出损失函数对 a 2 a_2 a2 的导数:
∂ L ∂ a 2 = ∂ ∂ a 2 [ − y log ⁡ a 2 − ( 1 − y ) log ⁡ ( 1 − a 2 ) ] \frac{\partial L}{\partial a_2} = \frac{\partial}{\partial a_2} \left[ -y \log a_2 - (1 - y) \log (1 - a_2) \right] a2L=a2[yloga2(1y)log(1a2)]

通过对两个项分别求导,可以得到:
∂ L ∂ a 2 = − y a 2 + 1 − y 1 − a 2 \frac{\partial L}{\partial a_2} = -\frac{y}{a_2} + \frac{1 - y}{1 - a_2} a2L=a2y+1a21y

5. 化简

我们可以将上面的结果进一步化简。首先,将两个分数合并成一个分数:
∂ L ∂ a 2 = − ( y ( 1 − a 2 ) ) + ( 1 − y ) a 2 a 2 ( 1 − a 2 ) \frac{\partial L}{\partial a_2} = \frac{-(y (1 - a_2)) + (1 - y) a_2}{a_2 (1 - a_2)} a2L=a2(1a2)(y(1a2))+(1y)a2

分子部分可以整理为:
− ( y − y a 2 ) + ( a 2 − y a 2 ) = a 2 − y -(y - y a_2) + (a_2 - y a_2) = a_2 - y (yya2)+(a2ya2)=a2y

因此,最终得到的结果是:
∂ L ∂ a 2 = a 2 − y a 2 ( 1 − a 2 ) \frac{\partial L}{\partial a_2} = \frac{a_2 - y}{a_2 (1 - a_2)} a2L=a2(1a2)a2y

6. 结合 sigmoid 函数的导数

根据链式法则,我们现在需要将损失函数对 a 2 a_2 a2 的导数与 a 2 a_2 a2 z 2 z_2 z2 的导数相乘。由于 ∂ a 2 ∂ z 2 = a 2 ( 1 − a 2 ) \frac{\partial a_2}{\partial z_2} = a_2 (1 - a_2) z2a2=a2(1a2),可以抵消掉前面结果中的分母 a 2 ( 1 − a 2 ) a_2 (1 - a_2) a2(1a2)

因此,最终的结果为:
∂ L ∂ z 2 = a 2 − y \frac{\partial L}{\partial z_2} = a_2 - y z2L=a2y

7. 公式的直观理解

公式 ∂ L ∂ z 2 = a 2 − y \frac{\partial L}{\partial z_2} = a_2 - y z2L=a2y 的含义是:损失函数对输出层输入值的导数等于模型的预测值 a 2 a_2 a2 和真实标签 y y y 之间的差值。

这个结果很直观:

  • 如果预测值 a 2 a_2 a2 和真实值 y y y 很接近,那么导数接近于 0,说明此时的参数不需要大幅度调整。
  • 如果预测值 a 2 a_2 a2 和真实值 y y y 相差很大,导数会很大,表示需要显著调整权重,以减少误差。

总结:

公式 8-13 的推导过程基于交叉熵损失函数和 sigmoid 激活函数。通过应用链式法则,我们将损失函数的导数逐步分解成每个部分的导数,最终得到了损失函数对输出层输入值 z 2 z_2 z2 的导数,即 ∂ L ∂ z 2 = a 2 − y \frac{\partial L}{\partial z_2} = a_2 - y z2L=a2y。这个公式表示损失函数的梯度等于模型输出与真实值的差值,用于指导神经网络的反向传播过程。

以下是三神经网络反向传播算法的 MATLAB 代码: ``` % 设置输入、隐藏输出的神经元个数 input_layer_size = 2; % 输入神经元个数 hidden_layer_size = 4; % 隐藏神经元个数 num_labels = 1; % 输出神经元个数 % 初始化权重矩阵 Theta1 = rand(hidden_layer_size, input_layer_size + 1) * 2 - 1; % 隐藏权重矩阵 Theta2 = rand(num_labels, hidden_layer_size + 1) * 2 - 1; % 输出权重矩阵 % 加载训练数据 load('data.mat'); % 定义代价函数 function J = costFunction(X, y, Theta1, Theta2) % 前向传播计算输出 m = size(X, 1); a1 = [ones(m, 1) X]; z2 = a1 * Theta1'; a2 = [ones(m, 1) sigmoid(z2)]; z3 = a2 * Theta2'; h = sigmoid(z3); % 计算代价函数 J = sum(-y .* log(h) - (1 - y) .* log(1 - h)) / m; end % 定义 sigmoid 函数 function g = sigmoid(z) g = 1 ./ (1 + exp(-z)); end % 定义 sigmoid 函数导数 function g = sigmoidGradient(z) g = sigmoid(z) .* (1 - sigmoid(z)); end % 定义反向传播算法 function [Theta1_grad, Theta2_grad] = backpropagation(X, y, Theta1, Theta2) % 前向传播计算输出 m = size(X, 1); a1 = [ones(m, 1) X]; z2 = a1 * Theta1'; a2 = [ones(m, 1) sigmoid(z2)]; z3 = a2 * Theta2'; h = sigmoid(z3); % 计算误差 delta3 = h - y; delta2 = delta3 * Theta2 .* sigmoidGradient([ones(m, 1) z2]); delta2 = delta2(:, 2:end); % 计算梯度 Theta1_grad = delta2' * a1 / m; Theta2_grad = delta3' * a2 / m; end % 训练神经网络 options = optimset('MaxIter', 1000); [nn_params, cost] = fmincg(@(p)(costFunction(X, y, reshape(p(1:hidden_layer_size * (input_layer_size + 1)), hidden_layer_size, input_layer_size + 1), reshape(p(hidden_layer_size * (input_layer_size + 1) + 1:end), num_labels, hidden_layer_size + 1))), [Theta1(:); Theta2(:)], options); Theta1 = reshape(nn_params(1:hidden_layer_size * (input_layer_size + 1)), hidden_layer_size, input_layer_size + 1); Theta2 = reshape(nn_params(hidden_layer_size * (input_layer_size + 1) + 1:end), num_labels, hidden_layer_size + 1); % 预测新样本的输出 x_new = [1.5, 2.0]; % 新样本的输入 a1_new = [1 x_new]; z2_new = a1_new * Theta1'; a2_new = [1 sigmoid(z2_new)]; z3_new = a2_new * Theta2'; h_new = sigmoid(z3_new); ``` 注:此代码是一个简单的三神经网络反向传播算法,只适用于二分类问题,如果要应用到多分类问题中,则需要做一些修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值