跳转至

2023 年 4 月

Transformer 中的 Positional Encoding Layer

在 Transformer 的模型结构中,Positional Encoding Layer 是将输入文本进行位置编码,使得模型知道每个词在文本中的绝对位置和相对位置。有时,当一个词的位置发生变化后,语义会发生巨大的变化,因此 Positional Encoding Layer 是至关重要的。

Transformer 原始论文中只给出了关键的编码公式,而我第一次看到这个公式时觉得晦涩难懂。深度学习课程的老师在课上讲解了之后,我还是不太明白。

\[ \begin{aligned} P E(p o s, 2 i+1)&=\cos \left(\frac{p o s}{10000^{2 i / d m o d e l}}\right) \\ P E(p o s, 2 i)&=\sin \left(\frac{p o s}{10000^{2 i / d m o d e l}}\right) \end{aligned} \]

终于,我找到了写得非常好的资料。作者从最简单的绝对位置编码(也就是将第一个位置编码为 1,第二个位置编码为 2,以此类推。这当然是最容易想到的方法。)开始介绍,一步一步引导我们为什么要用上面的公式。

image-20230430211441325

Python 滚动回归

本文实现了多个资产分别在时间序列上进行滚动回归,并返回由最新系数计算得到的残差,最后将多个资产的残差结果重新聚合为多重索引的数据框。

image-20230424173801905

基于 Bert 的中文问答机器人

最终训练的模型已经部署到 Hugging Face,请尝试输入一些简单的中文段落和相关问题 🌝

本文基于 Bert 的中文分词和问答的预训练模型,利用 10, 000 余条中文问答数据进行微调,构建了能够理解中文段落并回答相关问题的问答机器人。用自定义的数据进行测试,模型的效果基本能达到“正确回答小学三年级以下的阅读理解题”的水平。

predict-james

这是我第一次完整地实现一个 NLP 项目。在这个过程中,我学习了如何使用预训练模型、中文分词、准备数据、文本编码与解码、设计问答机器的损失与优化目标、导出训练模型等技术,对问答领域的 NLP 有了更透彻的理解。

理论部分可参考李沐老师的 Transformer 论文逐段精读【论文精读】BERT 论文逐段精读【论文精读】。当然,如果想要理解得更透彻一些,还是应该动手写代码,看看每一步到底在做什么,到真正实现出来看到模型结果的那一刻,是非常有成就感的。

不同 GPU 平台的训练效率对比

为对比不同平台上的 GPU 的训练效率的差异,我在 Kaggle、Google Colab、趋动云和本地的 Macbook Pro M1 Pro 四台机器上分别进行了训练。对于单个 Epoch:

  1. 付费使用的趋动云使用 2 个 GPU 并行训练,效率最高,单个 Epoch 共耗时 4 分 40 秒;
  2. 免费使用的 Kaggle 耗时 9 分钟,Google Colab 耗时 17 分钟;
  3. 在 Macbook Pro M1 Pro 上运行效率最低,即使使用了 GPU,单个 Epoch 仍预计耗时 3 小时。

使用不同惩罚项的线性回归进行变量选择

本文使用 SCAD、LASSO、Ridge 和 Garrote 惩罚项对线性回归进行了建模,在模拟数据下验证了不同惩罚项设计的对稀疏系数的选择能力。

原始论文的标题叫做 Variable Selection via Nonconcave Penalized Likelihood and Its Oracle Properties。对于 Oracle Properties,在 统计之都上有一个非常精彩的解释

Oracle 这个词对应的中文翻译叫做“神谕”,就是神的启示,它是指通过媒介(男女祭司或器物)传达神的难以捉摸或谜一般的启示或言语。在罚函数(比如 LASSO) 的研究领域,Oracle 指的是以下的渐进性质:

  1. 真值为 0 的参数的估计也为 0。
  2. 真值不为 0 的参数的估计值一致收敛到真值,并且协方差矩阵不受那些真值为 0 的参数估计的影响。

简而言之:罚函数的估计结果就好像事先已经得到了神的启示,知道哪些是真值为 0 的参数一样。

手动计算简单的反向传播算法

反向传播算法是深度学习进行参数优化的基础。本文手动计算了多层感知机中损失函数对权重、净输入值的梯度,并与 PyTorch 的计算结果进行了验证。

反向传播算法的本质是矩阵微分和链式法则,这两个知识都不难理解,但刚接触反向传播算法时总容易被一些陌生的符号弄糊涂。理解反向传播算法的理论推导,最重要的是弄清楚各个向量、矩阵的维度,以及熟练它们之间的前向传播关系。最后多加练习,就能对反向传播算法的理解更加透彻。

理论推导

image-20230411003621789

神经网络中的激活函数

激活函数在神经元中是非常重要的。为了增强网络的表示能力和学习能力,激活函数需要具备以下几点性质:

  1. 连续并可导(允许少数点上不可导)的 非线性函数 (若激活函数仍是线性函数,那么再多层的神经网络都只能拟合一个线性函数)。可导的激活函数可以直接利用数值优化的方法来学习网络参数。
  2. 激活函数及其导函数要尽可能的简单,有利于提高网络计算效率。
  3. 激活函数的导函数的值域要在一个合适的区间内,不能太大也不能太小,否则会影响训练的效率和稳定性。

本文总结了神经网络中常见的激活函数。

activation_functions

极大似然估计与最小均方误差的等价性

在使用最小二乘法估计线性模型的参数时,我们通常会将目标函数写成最小化均方误差的形式: $$ \hat\beta = \min_{\beta} \sum_{i=1}^n {\color{red}{(y_i - x_i^T \beta)^2}} $$

为什么我们要用 均方误差 作为损失函数?而不是绝对值误差、绝对值的三次方误差等其他形式?本文推导了极大似然估计与最小均方误差的等价性,说明最小均方误差是一种合理的做法。

单纯形法求解线性规划问题

线性规划的一般形式

在线性约束条件下,寻找目标函数 \(z\) 的最大值:

\[ \max \ z = x_1 + x_2 \]
\[ s.t \begin{cases} 2x_1 + x_2 \leq 12 \\ x_1 + 2x_2 \leq 9 \\ x_1, x_2 \geq 0 \end{cases} \]

线性规划的可行域

满足线性规划问题约束条件的所有点组成的集合就是线性规划的可行域。若可行域有界(以下主要考虑有界可行域),线性规划问题的目标函数最优解必然在可行域的顶点上达到最优。

单纯形法就是通过设置不同的基向量,经过矩阵的线性变换,求得基可行解(可行域顶点),并判断该解是否最优,否则继续设置另一组基向量,重复执行以上步骤,直到找到最优解。所以,单纯形法的求解过程是一个循环迭代的过程。

kexingyu

图 1 可行域

保持专注

回顾过去一个多月的学习和求职,我感到自己过得并不够专注。课业的强度、求职的不顺利,让我总是感觉有很多事情需要做,但又有很多事情没做好。对我来说,这不是一个好的状态,我需要付出行动改变它。

以下几点是我做出的改变,希望自己能长期坚持它们:

  1. 不拖延。 写在任务清单上的事项,一有时间就应该立即完成。在截止日期之前将任务打上勾,我会很享受这种成就感。

  2. 保持充足的睡眠。 这段时间我有时睡得很晚,投简历、刷算法题、整理面试经验、复习课业内容等等,让我感觉有很多事情要做。我通常到了 12 点之后才睡觉,超出的这段时间就好像是我捡来的一样,但这实际上影响了我第二天的睡眠。少做几道笔试题并不会怎么样,知识储备要靠长期的积累,而不是靠几个晚上就能快速提高的。是应该做些改变了:以饱满的精神迎接第二天的工作,工作效率的提高更像是我捡来了更多的时间。

  3. 珍惜让自己感到舒服的人和事。 求职无非就是加入一群人并和他们一起做一些事。能加入一个让自己感到舒服的团队、做让自己感到舒服的事情,是一件幸运的事,要珍惜。

春天已经到来,愿自己保持专注,重新出发!

flower-with-three-colors

这棵树开着三种不同颜色的花,据说是用嫁接技术实现的。