BP算法推导-softmax层+交叉熵(logloss)

本文介绍了在RNN基础上,如何在输出层加入softmax层,并详细推导了使用交叉熵损失函数时的反向传播过程。通过分析softmax层的输出和交叉熵的数学性质,得出误差信号的正确形式,并最终得到输出层到隐藏层权重的梯度更新公式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

摘要:


在之前的两篇文章中RNN训练与BP算法BP算法心得体会都是在具体在讲bp算法在神经网络里面的推导。两篇文章都没有讲过和softmax相关的东西。而softmax作为分类任务里面重要的一层,所以打算本篇文章介绍一下softmax层。另外,一致沿用的损失函数都是均方误差,所以借这个机会也讲解下当损失函数是交叉熵时候的推导情况。

引言:


本文打算在RNN训练与BP算法文章的基础,将最后一层输出层改成softmax层,推导整个公式。
下面是前向传播的公式(来源于上面的文章,新来的读者建议新看下这篇文章)

vim 是输入层第 m 个输入与隐藏层中第 i 个神经元所连接的权重。
uin 是隐层自循环的权重(具体表现为上面结构图中那些紫色、绿色的线)
wkm 是隐藏层中第m个神经元与输出层第k个神经元连接的权重。
网络中共有 N(i) N(h) N(o)

netthi 表示隐藏层第 i 个神经元在 t 时刻激活前的输入。
具体为: netthi=N(i)m=1(vimxtm)+N(h)s=1(uisht1s)
经过激活后的输出为: hti=f(netthi)

nettyk 表示输出层第 k 个神经元在 t 时刻激活前的输入。
具体为: nettyk=N(h)m=1(wkmhtm)
经过激活后的输出为: otk=g(nettyk)

这里,由于我们输出层是softmax所以只需要把输出层的激活函数 g(x) 设计成: g(xi)=exiallk=1exk 。这样我们就能够实现输出层进行softmax的操作。

具体来说: otk=enettykN(o)k=1enettyk

(大家可能发现了。希望网络输出softmax的结果只需要改输出层激活函数。那么推导公式中可能变化的也只有涉及到输出层激活函数部分的偏导数)

最后定义我们的损失函数——交叉熵:
Et=N(o)k=1ztkln(otk)
E=

### Transformer 的反向传播监督学习算法 #### 反向传播基础概念 反向传播是一种用于训练人工神经网络的有效方法,通过计算损失函数相对于权重的梯度来更新模型参数。对于循环神经网络(RNN),该算法被称为时间上的反向传播(BPTT)[^1]。 #### Transformer 架构概述 Transformer 是一种基于自注意力机制的架构,在自然语言处理和其他序列建模任务中表现出色。其核心组件包括多头自注意力模块、前馈神经网络以及残差连接和归一化操作。 #### 梯度计算流程 在执行一次完整的正向传递之后,即输入经过编码器堆栈并最终到达解码器输出端口后,可以开始进行误差信号沿相反方向流动的过程: - **损失评估**:首先定义一个合适的损失函数\(L\)衡量预测值\(\hat{y}\)与真实标签\(y\)之间的差异程度; - **局部敏感性分析**:接着针对每一内部节点求取关于各自激活状态的变化率; - **链式法则应用**:利用微积分中的链式法则是实现高效自动化的关键所在,它允许逐级累积来自下游单元的影响直至触及最底可调参量为止。 具体到单个变压器而言,则涉及到如下几个方面的工作: ##### 自注意机制部分 设查询矩阵Q、键K 和 值V 的维度均为 \(d_k \times d_v\) ,则有: \[Attention(Q,K,V)=softmax(\frac{QK^{T}}{\sqrt {d_{k}}})V\] 因此当考虑对某个特定位置i处元素做偏导数运算时会得到: \[\delta _{W}=\sum_j (\alpha_{ij}-\bar {\alpha}_{j})(q_i-\mu_q)(k_j-\mu_k)^T/\sigma ^2+\lambda W\] 其中涉及到了软最大值分布及其均值方差统计特性等因素共同作用的结果表达形式[^3]。 ##### 前馈子环节 假设采用两线性变换加ReLU作为非线性的简单结构设计模式下,那么相应的权值调整公式应为: \[w' = w - lr * ((x*max(0,w*x-b)-t)*x+(l_1*w+l_2*w))\] 这里引入了L1/L2 正规项防止过拟合现象发生的同时也体现了随机梯度下降过程中所遵循的一般规律特点[^2]。 ```python import torch.nn as nn from transformers import BertModel class CustomBert(nn.Module): def __init__(self): super(CustomBert, self).__init__() self.bert = BertModel.from_pretrained('bert-base-uncased') def forward(self, input_ids=None, attention_mask=None, labels=None): outputs = self.bert(input_ids=input_ids, attention_mask=attention_mask) loss_fct = nn.CrossEntropyLoss() start_logits, end_logits = outputs.start_logits, outputs.end_logits total_loss = None if labels is not None: ignored_index = start_logits.size(1) start_positions_clipped = labels[:, 0].clamp(0, ignored_index) end_positions_clipped = labels[:, 1].clamp(0, ignored_index) start_loss = loss_fct(start_logits, start_positions_clipped) end_loss = loss_fct(end_logits, end_positions_clipped) total_loss = (start_loss + end_loss) / 2 return {"loss":total_loss,"logits":outputs.logits} ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值