CS231n笔记10:Attention与Transformer
P1:Atention机制 引入 课上是使用RNN处理翻译工作的例子来引入Attention的: 在传统的Encoder-Decoder架构中,Encoder会将输入句子编码成一个固定长度的向量,然后Decoder根据这个向量生成输出句子。然而,这种方法在处理长句子时效果不佳,因为固定长度的向量可能无法捕捉到所有重要的信息。这个问题可以通过查看整个输入序列来解决,而不是仅仅依赖于一个固定长度的向量。 对于Decoder,我们给出一个初始的隐藏状态 s0s_0s0 ,将这个隐藏状态与Encoder的所有隐藏状态进行比较,计算出每个隐藏状态的重要性权重(也就是注意力权重),这个权重告诉Decoder在生成下一个词时应该关注输入序列的哪些部分。然后,对这些状态进行加权求和,得到一个上下文向量 c1c_1c1 ,这个向量包含了输入序列中最相关的信息。最后,Decoder使用这个上下文向量 c1c_1c1 ,输入 y0y_0y0 和当前的隐藏状态 s0s_0s0 来生成下一个词,随后重复整个过程来完成翻译。 以这个英语到法语的翻译为例,可以看出在这个二维的注意力图中,每个输...
CS231n笔记09:循环神经网络
P1:循环神经网络 组成 循环神经网络一般用于处理序列数据,如文本和语音等。它的输入和输出的序列长度可以是任意的。循环神经网络通过中间隐藏层的循环连接来捕捉此前序列中的信息,并应用于当前的输出。 左侧是循环神经网络的单元,中间的隐藏状态随着序列处理更新,可以展开成类似右侧的形式。隐藏状态通过 ht=fW(ht−1,xt)h_t = f_W(h_{t-1}, x_t)ht=fW(ht−1,xt) 来更新,其中 WWW 是变换的参数;输出则通过当前时间步的隐藏状态得到,即 yt=fWhy(ht)y_t = f_{W_{hy}}(h_t)yt=fWhy(ht) 得到。每个时间步使用变换的参数如 WWW 和 WhyW_{hy}Why 在序列处理的各个时间步都是共享的。 计算隐藏层时还要用到激活函数,这里使用 tanhtanhtanh 函数: ht=tanh(Wxhxt+Whhht−1)h_t = tanh(W_{xh}x_t + W_{hh}h_{t-1}) ht=tanh(Wxhxt+Whhht−1) yt=Whyhty_t = W_{hy}h_t y...
CS231n笔记08:CNN训练
P1:权重初始化 初始化大小选择 初始化权重的示例: 12345678dims = [4096] * 7hs = []x = np.random.randn(16, dims[0])for Din, Dout in zip(dims[:-1], dims[1:]): W = p * np.random.randn(Din, Dout) x = np.maximum(0, x.dot(W)) hs.append(x) 在这段代码中,使用p来控制权重的初始化范围。不同的p值会影响网络的训练效果。p较小时(如0.01),随着层数加深,方差逐渐趋近于0,导致梯度消失; p较大时(如0.05),方差会变得非常大,导致梯度爆炸。 Kaiming/MSRA Initialization 为了解决p的选择问题,使用Kaiming/MSRA初始化方法: 1234for Din, Dout in zip(dims[:-1], dims[1:]): W = np.random.randn(Din, Dout) * np.sqrt(2.0 / Din) x = np.m...
CS231n笔记07:卷积网络与残差网络
P1:卷积网络 标准化 在神经网络中,随着网络的加深,输入的分布会随着前一层参数的变化而变化,导致训练效率下降。这种现象导致模型必须使用更小的学习率和更谨慎的参数初始化。虽然非线性激活函数和小学习率等方法能部分缓解问题,但是无法从根本上解决分布变化带来的梯度消失或爆炸问题。因此引入标准化: 上图中总结了常用的标准化方法,其中H,W是特征图的高与宽,C为特征图通道数,N为Batch Size。标准化就是将数据变换为均值为0,方差为1的分布,然后再通过可学习的缩放和平移参数保留数据的表达能力,公式如下: Normalization(x)=γx−μσ+β\text{Normalization}(x) = \gamma \frac{x - \mu}{\sigma} + \beta Normalization(x)=γσx−μ+β 其中μ,σ\mu, \sigmaμ,σ分别为均值和标准差,γ,β\gamma, \betaγ,β为可学习的缩放和平移参数。不同的标准化方法通过计算不同维度的数据均值和方差来实现对数据的标准化处理。 Batch Normalization: Accelerat...
CS231n笔记06:卷积层
在之前的神经网络中,使用了全连接层来处理输入数据。然而,对于图像等具有空间结构的数据,这种网络将图像拉伸成了一个一维向量,向量中的每一个元素的地位是相同的,抛弃了原始图像中像素的位置信息。卷积神经网络(Convolutional Neural Networks, CNNs)通过引入卷积层,能够更好地利用图像的空间结构信息,从而提升模型的性能。 P1:卷积 首先考虑一张图片,宽度为 WWW,高度为 HHH,通道数为 CinC_{in}Cin(此处 RGB 图像的 C=3C=3C=3)。卷积操作使用一个大小为 Kw×Kh×CinK_w \times K_h \times C_{in}Kw×Kh×Cin 的卷积核(filter 或 kernel)的权重矩阵在图像上滑动,对图像的局部区域进行加权求和,从而提取特征。假设卷积核每次在图像上移动1个像素,那么卷积核每一次运算产生一个标量,通过在原图上滑动卷积核,可以得到一个新的Activation Map,大小为 (W−Kw+1)×(H−Kh+1)(W - K_w + 1) \times (H - K_h + 1)(W−Kw+1)...
CS231n笔记05:神经网络与反向传播
P1:神经网络 此前已经使用f=Wxf = Wxf=Wx构建了线性分类器,并通过正则化和梯度下降等技术提升了模型的泛化能力。接下来为了提高模型的表达能力,将组合之前的线性变换与非线性激活函数,构建更复杂的神经网络模型。 显然,如左图所示,一个线性分类器并不能很好的拟合分布复杂的数据,但是如果线性分类前将数据的分布转化成容易被线性分类器分类的形式(如右图所示),那么线性分类器也能取得不错的效果。神经网络的目标就是通过多层非线性变换,将数据映射到一个新的空间,使得在该空间中数据更容易被区分开来。 在原有基础上再加一层线性变换和非线性激活函数,得到: f=W2max(0,W1x)f = W_2 \max(0, W_1 x) f=W2max(0,W1x) 其中max(0,t)max(0, t)max(0,t)作为激活函数,在两层网络中引入非线性(如果没有这个函数,那么两个矩阵运算可以合并成一个矩阵运算f=(W2W1)x=Wxf = (W_2 W_1) x = W xf=(W2W1)x=Wx,那么添加这一层就没有意义了)。 激活函数有很多常见的形式,如Sigmoid、Tanh...
CS231n笔记04:优化与梯度下降
统一记号: 目标函数(loss):L(θ)L(θ)L(θ),参数向量:θθθ 第 ttt 次迭代(iteration)参数:θtθ_tθt 梯度:gt=∇θ L(θt)g_t = ∇_{θ}\,L(θ_t)gt=∇θL(θt) 学习率:ηηη(或 ααα) mini-batch:Bt\mathcal{B}_tBt,其梯度估计记为 gt=∇θ LBt(θt)g_t=∇_{θ}\,L_{\mathcal{B}_t}(θ_t)gt=∇θLBt(θt) P1:优化器 优化器是在反向传播给出梯度之后,决定“参数往哪里走、走多远”的更新规则,一个最常见的形式是损失最小化: minθ L(θ)=1N∑i=1Nℓ(f(xi;θ),yi)\min_{θ}\; L(θ)=\dfrac{1}{N}\sum_{i=1}^{N} \ell\big(f(x_i;θ),y_i\big) θminL(θ)=N1i=1∑Nℓ(f(xi;θ),yi) 反向传播(backprop)负责高效地算出梯度 ∇θL\nabla_\theta\mathcal{L}∇θL;优化器负责把梯度...
CS231n笔记03:正则化
假设我们已经找到一组参数 WWW,能把训练集每个样本都分对,并且对所有错误类都满足 margin(于是对所有样本 Li=0L_i=0Li=0)。这组 WWW 通常不是唯一的。因为只要 WWW 满足 margin,那么对任意 λ>1\lambda>1λ>1,λW\lambda WλW 也同样满足: 分数 f(x;W)f(x;W)f(x;W) 会整体按比例变大 正确类与错误类之间的分数差也按比例变大 hinge loss 只关心“有没有超过间隔”,一旦超过就变 0 所以“数据损失=0”并不能表达我们对参数的偏好,会出现一堆“同样正确、但尺度不同”的解。 P1:正则化 解决办法是在目标函数里加入仅依赖参数的惩罚项 R(W)R(W)R(W),用来编码“更偏好哪类权重”。最常见的是L2正则(岭回归): R(W)=∑k∑lWk,l2R(W)=\sum_k\sum_l W_{k,l}^2 R(W)=k∑l∑Wk,l2 也可以把它理解成“对每个权重 www 直接惩罚它的平方”,在目标函数里额外加上: 12λw2\frac{1}{2}\lambda w^2 21λw...
CS231n笔记02:损失函数
对第 iii 个样本,输入xix_ixi,模型输出分数向量 s=f(xi;W)∈RCs=f(x_i;W)\in\mathbb{R}^Cs=f(xi;W)∈RC,其中 sis_isi 是第 iii 类的分数。直觉上,预测准确则loss低,预测错误则loss高。 损失函数最常见的两种选择有Hinge loss和Softmax loss。 P1:Hinge loss 多分类 SVM 希望:正确类的分数 syis_{y_i}syi 比每个错误类分数 sjs_jsj 至少高一个固定间隔(margin)Δ\DeltaΔ。 对单个样本的 loss 定义为: Li=∑j≠yimax(0, sj−syi+Δ)L_i = \sum_{j\neq y_i} \max\big(0,\; s_j - s_{y_i} + \Delta\big) Li=j=yi∑max(0,sj−syi+Δ) 若 syi≥sj+Δs_{y_i} \ge s_j + \Deltasyi≥sj+Δ,这一项为 0(该错误类“达标了”) 若 syi<sj+Δs_{y_i} < s_j ...
CS231n笔记01:kNN分类与线性分类
P1:kNN与距离函数 k最近邻分类器 kNN(k-Nearest Neighbor)分类器,就是对于每一张测试集中的图片,找到与它最接近的k张图片,从这k张图片中选出最多的一个种类作为它的的种类。 放到这张图上来说就是将训练集抽象成不同颜色(代表不同种类)的数据点,整个空间就是可能出现的数据点的集合,kNN分类器使用训练集中的数据点来划分这个空间,测试集中的点落在哪一个区域内就归为哪一类。图中的灰色区域则是出现“平票”的区域。 距离函数 对比两张图片之间的距离时,将W*H的图片(每个像素为一个3维向量)拉伸成W*H*3的向量,然后计算这两个向量之间的距离。有以下两种计算距离的函数: L1 距离:向量各个维度上差的绝对值之和,对单个大差异的惩罚是线性的,因此更不容易被单个异常值主导。 L2 距离:向量各个维度上差的平方和开根号,平方项会放大大差异的影响。当把图像看作像素向量时,若两张图像在少数像素上有巨大差异(例如一个噪点或遮挡),L2 会把这类差异放大,导致距离很大;而 L1 会把这些差异按绝对值线性累加,对整体相似性影响较小。 交叉验证 将模型用于测试集之前需要选取一些参...










