[TOC]
- End-To-End Memory Networks
- year: 2015 NeuralIPS
- 阅读笔记:
- 给定一个memory set,通过一个矩阵A映射到一个向量空间,与query embedding进行点积计算,使用softmax计算weights
- 将memory set通过一个矩阵C映射到一个向量空间,使用weights加权后得到输出
- 将输出向量和query向量相加后,通过一个线性层softmax计算概率分布
- code:
-
Layer Norm
-
在单个样本的特征维度上进行归一化
-
对每个样本 N 归一化
-
具体如何做:假设输入张量形状为:(N, C, H, W)(例如图像数据,N 是 batch size,C 是通道数,H/W 是高/宽),针对每个样本,计算所有特征的均值和方差,然后进行归一化。
-
代码实现
def manual_ln(x): # x: (..., D) # x.mean(dim)其中dim表示在哪个维度上进行聚合 mean = x.mean(dim=-1, keepdim=True) # shape: (..., 1) var = x.var(dim=-1, unbiased=False, keepdim=True) return (x - mean) / torch.sqrt(var + 1e-5)
-
-
Batch Norm
-
在 batch 维度上进行归一化
-
对每个通道 C 归一化
-
具体如何做:同样假设输入为:(N, C, H, W) ,batchNorm是针对每个特征维度,即通道Chanel,计算该维度在整个batch上的均值和方差,然后进行归一化。
-
代码实现
def manual_bn(x): # x: (N, C, H, W) mean = x.mean(dim=(0, 2, 3), keepdim=True) # shape: (1, C, 1, 1) var = x.var(dim=(0, 2, 3), unbiased=False, keepdim=True) return (x - mean) / torch.sqrt(var + 1e-5)
-
-
RMSNorm(Root Mean Square Layer Normalization)
- 相比Layer Norm,分子去掉了减去均值部分,分母的计算使用了平方和的均值再开平方
-
DeepNorm
- 对Post-LN的改进
- 以alpha参数来扩大残差连接,LN(alpha * x + f(x))
- 在Xavier初始化过程中以Bata减小部分参数的初始化范围
pre-norm 和 post-norm 的区别到底是什么? 我理解 post-norm 每层输出都会做 LN,所以传到下一层的输入分布也稳定;而且除了第一层 embedding 之外,后面每层的输入都已经 LN 过了。 那 post-norm 是不是基本等同于 pre-norm?如果不等同,关键差别到底在哪里?
差异 1:残差“直通路径”是否被 LayerNorm 夹住(训练稳定性的关键)
Post-norm: $$ x_{l+1}=\mathrm{LN}\big(x_l + F(x_l)\big) $$
反向传播时,梯度从
Pre-norm: $$ x_{l+1}=x_l + F\big(\mathrm{LN}(x_l)\big) $$
此时梯度里永远带有一个来自残差的保底项
结论:pre/post 最大的训练差异不在“下一层输入是否 LN 过”,而在“残差梯度通路有没有被 LN 打断”。
差异 2:LN 作用在“加和之后” vs “进入子层之前”(前向表示的约束方式不同)
你指出的事实是对的:在标准堆叠里,post-norm 的
但两者仍然不同,因为 LN 的位置改变了每层对表示的“重写方式”:
-
**Post-norm:**LN 作用在加和之后
$\mathrm{LN}(x_l+F(x_l))$ → 每层都会把“残差累加后的表示”重新归一化,相当于对每层输出施加强约束(尺度/方向会被 LN 重新缩放/投影)。 -
**Pre-norm:**LN 作用在进入子层之前
$F(\mathrm{LN}(x_l))$ → LN 主要用于给子层稳定工作点,但 residual 累加的表示本身不在每层被 LN 强制重写(通常只在最后再做一次 final LN)。
-
Gaussian Error Linear Units(GELUs)
- GELU,Relu的平滑版本
- 处处可微,使用了标准正态分布的累计分布函数来近似计算
-
Swish: a Self-Gated Activation Function
- Swish
- 处处可微,使用了beta来控制函数曲线形状
- 函数为f(x) = x * sigmoid(betan * x)
-
SwiGLU
- 是Swish激活函数和GLU(门控线性单元)的结合
- GLU使用sigmoid函数来控制信息的通过,GLU = sigmoid(xW+b) 矩阵点积操作 (xV + c)
- SwiGLU: swish(xW+b) 矩阵点积操作 (xV + c)
- Adam和AdamW的区别
- Adam,AdamW,LAMB优化器原理与代码
- Adam使用了一阶动量矩和二阶动量矩,为每个参与赋予不同的学习率,梯度较大的参数获取的学习率较小,梯度较小的参数获取的学习率大
- Adam收敛速度快但是存在过拟合问题,直接在loss中添加L2正则,但是会因为adam中存在自适应学习率而对使用adam优化器的模型失效,AdamW在参数更新时引入参数自身,达到同样使得参数接近于0的目的
- LAMB是是模型在大批量数据训练时,能够维持梯度更新的精度
- 张俊林:对比学习在微博内容表示的应用
- 利用Contrastive Learning对抗数据噪声:对比学习在微博场景的实践
- 对比学习(Contrastive Learning):研究进展精要
- 2021最新对比学习(Contrastive Learning)在各大顶会上的经典必读论文解读
- 对比学习(Contrastive Learning)在CV与NLP领域中的研究进展
- [论文随读]ACL2021对比学习论文一句话总结
- 图灵奖大佬 Lecun 发表对比学习新作,比 SimCLR 更好用!
- 陋室快报-对比学习热文-20211115
- 自监督对比学习(Contrastive Learning)综述+代码
- 对比学习(Contrastive Learning)综述
- 对比学习(Contrastive Learning)相关进展梳理
NLP领域:
- CoSENT(一):比Sentence-BERT更有效的句向量方案
- 又是Dropout两次!这次它做到了有监督任务的SOTA
- ACL 2021|美团提出基于对比学习的文本表示模型,效果提升8%
- 你可能不需要BERT-flow:一个线性变换媲美BERT-flow
- 丹琦女神新作:对比学习,简单到只需要Dropout两下
- 基于对比学习(Contrastive Learning)的文本表示模型为什么能学到语义相似度?
- Open-AI:基于对比学习的无监督预训练
- ACL2022 | 反向预测更好?基于反向提示的小样本槽位标注方法
- conv1d与conv2d的区别
- conv2d的卷积运算是在二维矩阵中滑动,而conv1d的卷积运算是在一维向量中滑动。
- textCNN中使用的conv2d
- 为什么要用空洞卷积?
- 时间卷积网络(TCN)将取代RNN成为NLP预测领域王者
- 因果卷积(causal)与扩展卷积(dilated)
- 一文读懂 12种卷积方法(含1x1卷积、转置卷积和深度可分离卷积等)
- 关于 Network-in-network理解和实现
- 可变形卷积从概念到实现过程
- 人工智能 CNN VS LSTM 选择及优化
- pack_padded_sequence 和 pad_packed_sequence
- 人人都能看懂的GRU
- 人人都能看懂的LSTM
- [深度学习] RNN对于变长序列的处理方法, 为什么RNN需要mask
- Tree-Structured LSTM介绍
- LSTM网络参数计算
- 将任意实数映射为正值,这是概率的必要条件
- 放大差异:小的logits差异,概率比呈现指数级变化
- e指数梯度稳定、数值友好,与对数似然/最大熵原理的内在一致性
- 具有平移不变性
- 可微、光滑、梯度处处存在
当然,以下是带有LaTeX格式公式的两层MLP回归网络的前向传播和反向传播过程。
假设输入 ( X ) 的维度是 ( (n, d) ),隐藏层的单元数是 ( h ),输出层的单元数是1(回归任务)。前向传播包括两个主要步骤:
输入通过权重 ( W_1 ) 和偏置 ( b_1 ) 进行线性变换:
然后应用激活函数(例如ReLU):
隐藏层的输出通过权重 ( W_2 ) 和偏置 ( b_2 ) 进行线性变换:
最终输出:
这里,输出 ( \hat{Y} ) 是回归任务的预测值。
反向传播计算每一层的梯度,以下是每一层的梯度计算公式。
损失函数使用均方误差(MSE):
其中 ( y_i ) 是真实值,( \hat{y}_i ) 是预测值。
计算输出层的梯度:
然后计算输出层的权重和偏置的梯度:
- 对 ( W_2 ) 的梯度:
- 对 ( b_2 ) 的梯度:
接下来,计算隐藏层的梯度:
然后对隐藏层的输入 ( Z_1 ) 应用激活函数的导数:
ReLU的导数为:
然后计算隐藏层的权重和偏置的梯度:
- 对 ( W_1 ) 的梯度:
- 对 ( b_1 ) 的梯度:
import numpy as np
class MLPRegressor:
def __init__(self, input_dim, hidden_dim):
# 初始化权重和偏置
self.W1 = np.random.randn(input_dim, hidden_dim) * 0.01
self.b1 = np.zeros(hidden_dim)
self.W2 = np.random.randn(hidden_dim, 1) * 0.01
self.b2 = np.zeros(1)
def relu(self, x):
return np.maximum(0, x)
def relu_derivative(self, x):
return (x > 0).astype(float)
def forward(self, X):
self.X = X
self.Z1 = X.dot(self.W1) + self.b1
self.A1 = self.relu(self.Z1)
self.Z2 = self.A1.dot(self.W2) + self.b2
self.Y_hat = self.Z2
return self.Y_hat
def backward(self, X, Y):
# 计算输出层的梯度
m = X.shape[0]
dZ2 = (2/m) * (self.Y_hat - Y)
dW2 = self.A1.T.dot(dZ2)
db2 = np.sum(dZ2, axis=0, keepdims=True)
# 计算隐藏层的梯度
dA1 = dZ2.dot(self.W2.T)
dZ1 = dA1 * self.relu_derivative(self.Z1)
dW1 = X.T.dot(dZ1)
db1 = np.sum(dZ1, axis=0)
# 更新权重和偏置
self.W1 -= 0.01 * dW1
self.b1 -= 0.01 * db1
self.W2 -= 0.01 * dW2
self.b2 -= 0.01 * db2
# 测试 MLP 回归网络
X = np.random.randn(5, 3) # 5个样本,3个特征
Y = np.random.randn(5, 1) # 5个样本,1个输出
# 创建模型
model = MLPRegressor(input_dim=3, hidden_dim=4)
# 前向传播
Y_hat = model.forward(X)
print("预测值 Y_hat:\n", Y_hat)
# 反向传播
model.backward(X, Y)在前向传播中,使用线性变换和激活函数来计算每一层的输出。在反向传播中,通过链式法则计算每一层的梯度,并更新网络的权重和偏置。反向传播的核心步骤包括:
- 计算输出层的梯度;
- 计算隐藏层的梯度;
- 更新权重和偏置。
这些梯度计算步骤对于训练神经网络至关重要,尤其是在回归任务中。
- Noise Contrastive Estimation 前世今生——从 NCE 到 InfoNCE
- 标签平滑Label Smoothing
- 一个小问题:深度学习模型如何处理大小可变的输入
- 损失函数为什么使用交叉熵多而不是MSE(均方差)?
- 文本分类入门(十一)特征选择方法之信息增益
- 互信息(Mutual Information)的介绍
- 径向基函数(RBF)神经网络
- 预测时一定要记得model.eval()!
- bert家族中的mask机制
- 谈谈由异常输入导致的 ReLU 神经元死亡的问题
- PyTorch || 优化神经网络训练的17种方法
- Multi-Sample Dropout
- F-散度(F-divergence)
- 从Softmax到AMSoftmax(附可视化代码和实现代码)
- 准确率Accuracy与损失函数Loss的关系
- 关于LogSumExp
- 稀疏矩阵存储格式总结+存储效率对比:COO,CSR,DIA,ELL,HYB
- BiLSTM-CRF学习笔记(原理和理解)
- 微调也重要:探究参数初始化、训练顺序和提前终止对结果的影响
- 看完这篇,别说你还不懂Hinton大神的胶囊网络
- 漫谈autoencoder:降噪自编码器/稀疏自编码器/栈式自编码器
- 胶囊网络:更强的可解释性
- 【深度学习笔记】熵 KL散度与交叉熵
- 一文看懂深度学习发展史和常见26个模型
- 欧氏距离与余弦距离的关系
- 仿射VS线性全连接 双仿射VS双线性
- 综述:深度学习中的池化技术
- 硬核Softmax!yyds! (面试真题,慎点!)
- Spatial Dropout
- 【让模型更加谦虚】Adaptive Label Smoothing方法让模型结果更加鲁棒