人工智能之自然语言处理(人工智能 LLM 革命前夜:一文读懂横扫自然语言处理的 Transformer 模型)
大家好!我是麦克船长 ,目前就职于阿里巴巴集团 ,任总监/资深综合运营专家 ,先后负责过淘宝行业产品团队 、天天特卖 、大聚划算运营中心 。网名一直用「麦克船长」 ,中科大计算机本科毕业后先是做的音视频流媒体技术 、分布式系统等等 ,干过 Full Stack ,后来创业在技术 、产品 、运营 、营销 、供应链等等方面多年后来到阿里 ,在淘系带过不同业务的产品 、运营团队 。文本来自我的个人博客:MikeCaptain - 麦克船长的技术 、产品与商业博客,梳理了自己在春节期间对 NLP 基础模型的技术演变学习笔记记录 ,写就于大年初一在香港过春节时 。本文包含 3 个章节:
第一章 ,主要介绍 Transformer 出现之前的几个主流语言模型,包括 N 元文法(n-gram) 、多层感知器(MLP) 、卷积神经网络(CNN)、循环神经网络(RNN) 。其中 CNN 主要应用领域在计算机视觉 ,因此没有更详细展开 。其他模型也未面面俱到 ,主要考虑还是一个领域学习者的角度来了解和应用 ,而非研究 。 第二章 ,是本文的核心 ,先介绍了注意力机制(Attention Mechanism) ,然后基于第一章对此前几大语言模型了解后 ,我们能更好地理解 Transformer 为什么会带来革命性的影响 。 第三章 ,是一个 Transformer 的实现版本 ,基于 Tensorflow 。春节期间 ,除了本文 ,我还梳理了一篇关于「大型语言模型(LLM)在 Transformer 之后的演化综述」和一篇关于「LLM 引领生产力革命 ,带来的未来几年科技脉搏把控」,但没有时间整理排版 ,待日后有空再归拢后发出 ,这些权当是在春节期间消磨时间的技术爱好,因为是偏向学习的技术笔记 ,所以非常欢迎大家批评 、指正 、交流 。
作者:钟超(麦克船长) 邮箱:zhongchao.ustc#gmail.com (#->@) 微信:sinosuperman(请注明「公司/机构、职位」便于我备注 ,谢谢) 时间:2023 年 1 月 22 日前言
本文试图从技术角度搞清楚一个问题:过去一年 AIGC 爆火 、过去五年 NLP(自然语言处理)领域突飞猛进的缘起是什么?
这个问题被解答后 ,将还有两个问题 ,但暂时本文没有作答:1)如果认为通过图灵测试代表着 AGI(Artificial General Intelligence ,通用人工智能)的话 ,当下 NLP ,乃至 AGI 发展到什么程度了?2)未来一些年内 ,AGI 的发展路线可能会是怎样的?
利用春节时间 ,写了这么一篇数万字的长文笔记 ,希望共同爱好的朋友能读完多多指正 。
1 、我来阿里之后第一个新增爱好是「变形金刚模型」 ,第二个新增爱好是「变形金刚模型」写了个这么冷的梗 ,其实想说的是,前者指的是著名 IP「变形金刚」相关的手办玩具模型 ,后者指的是这个引领革命的人工智能语言模型 Transformer。这两个爱好 ,都与目前从事的电商工作本职没有表面上的直接联系,权当爱好了 。
2022 年「生成式 AI」应用取得了突飞猛进的发展 ,作为一个「古典互联网」从业者 ,深切地感到这一次 AI 技术可能会带来的颠覆式变革 ,这让我兴奋又焦虑 。2022 年上半年 ,我从天天特卖业务负责人到大聚划算运营中心负责人 ,在去年相当长一段时间里在关注直播带货在营销平台的模式命题 ,一直在思考一个问题:直播电商的高效(更适合的商品演绎方式 + 私域权益 + 冲动购买等」vs. 直播电商的低效(直播分发无人货匹配 + 直播间内千人一面 + 货品状态未知 + 主播不可控等) ,能否推动一个保留直播的高效 ,同时解决直播的低效的模式呢?
这里面有大量的内容值得探讨 ,不过这不是麦克船长该系列文章的初衷 ,但这是我为什么开始非常关注 AI 的引子。直播电商的数字人技术基础 ,有动作捕捉 、面部表情模拟 、视觉渲染 、直播话术生成 、语音合成等等 。依据第一性原理抽丝剥茧后 ,我发现尽管动作捕捉 、视觉渲染等等很多技术仍有很大挑战,但是从商业视角看真正最影响用户心智的 ,是直播话术生成和演绎 ,除了头部主播,绝大多数直播带货在这方面都做的很糟糕 ,那么这里面就有巨大的「机器学习」生成内容超越非头部的大多数从业者的市场空间 ,而这完全依赖自然语言处理(NLP) 。
这个问题就属于「生成式 AI」的范畴了 ,国外科技圈叫它「Gen-AI」 ,即 Generative AI ,中国科技圈都叫它「AIGC」 ,即 AI Generated Content ,与 UGC 、PGC 相对应 。Gen-AI 的叫法更关注主体 ,具体地说是「生成式 AI 模型」 ,它是个「内容引擎」 。而中国的叫法更关注「内容应用」 。
讲到 AIGC 这里 ,大家熟悉的 ChatGPT 就在 2022 年年底登场了 。也是因为 ChatGPT 的破圈 ,带来了 AIGC 在国内科技圈的关注度暴涨 。我从去年年中开始关注「文生图 ,text2image」领域的明星 Stable Diffusion 开源,进而关注到了 text2image 应用的爆发 ,包括 Disco Diffusion 、MidJourney 、DALL·E 2 等等 ,这些都源于 CV(计算机视觉)领域因为 Diffusion 模型发展带来的技术突破 。
AI 生成图片确实非常惊人 。我酷爱变形金刚模玩,进而对机甲类都非常喜欢 ,所以随手生成了几张图 ,这里贴一下大家看看 ,分钟级的创作速度 。(注意:当下 AI 生成图片主要是基于 Diffusion 的应用发展 ,AI 生成文本的核心驱动才是 Transformer 模型 ,此处只是展示)
但是从第一性原理角度讲 ,生成图片的应用广度 ,远远小于生成文本 。文本内容的本质是语言文字的理解与生成 ,人类历史有 600 万年 ,但是人类文明历史大概就 6000 年 ,文明的大发展出现在近 2000 多年的原因 ,主要来自 3500 多年前人类发明了文字 。所以 AI 生成文本 ,意味着 AI 可以用人类熟悉的方式(语言文字)与人类高效协作,这必将引爆生产力革命。而这必将深入影响电商 、内容 、游戏、云计算 、企业服务等众多领域 。
2 、掌握技术基础 ,是当下读懂 AI 脉搏的基本功 ,而这个脉搏将带动各行各业一旦深入关注 AI、关注 NLP 领域,你就会发现当下仍然处于一个技术发展突破的阶段 ,不关注技术的情况下来聊 AI 、聊 NLP 、聊 AIGC ,那就只能是一个「爱好者」 ,而无法深入与这个行业内的弄潮儿对话 ,更不要提参与其中了 。所以这个春节 ,麦克船长回归了当年做技术时的初心 ,翻了一些材料 ,学习了 NLP 语言模型的关键技术 ,在此作为技术学习笔记 ,与大家分享。尽管担心班门弄斧 ,但是本着费曼老师提倡的输出学习法 ,我把自己学习梳理的内容抛出来 ,除了会更帮助到我自己,也能结交一些对此同样在关注的同学们 ,欢迎感兴趣的同学加我的微信(微信号 sinosuperman)在业余时间和我交流 。
阅读本文 ,先对你过往的基础知识做了一些假设,如果你暂未了解 ,可能在阅读时遇到以下内容做一些简单地查询即可:
Word Presentation:自然语言处理中的词表示法 ,主要涉及 embedding 。 张量:需要一点基础 ,比如了解张量的形状 、升降维度等 。但不会涉及到复杂问题 ,对一阶张量(向量) 、二阶张量(矩阵)的简单运算有数学基础即可 。对三阶张量 ,大概能想象出其空间含义即可 。语言模型里理解词之间的距离 ,是有其空间几何意义的 。 技术框架:PyTorch 或 TensorFlow 框架 。由于时间和篇幅关系 ,春节期间梳理这些时 ,对于框架基础 ,我主要是 Google 现用现查 ,询问 ChatGPT 以及在微信读书里直接搜索全文 。作为技术笔记难免有纰漏或理解错误 ,欢迎指正 。文中自绘图片用的是 Graphviz ,公式生成用的是 KaTeX,贴到 ATA 后难免有一些没有兼容的部分(发现的已做了 fix) ,望见谅 。
第一章 · 2017 年之前的几个关键 NLP 语言模型
NLP 的技术基础方面 ,我认为主要是这两部分:词表示法(Word Presentation) 、语言模型(Language Model) 。对于词表示法,这里不做详细介绍 ,基本的思路就是把词表示为向量(一维张量) ,最基本的 One-Hot 、Word2Vec 、GloVe 、fastText 等 。这部分的技术演进也在不断前进 ,比如本文将要重点介绍的 Transformer 模型里 ,用到的词表示法是「引入上下文感知的词向量」。
语言模型从早期的 N 元文法(N-Gram ,本文要介绍的) ,到神经网络被提出后最早期的感知器(Perceptron) ,再到后来席卷计算机视觉(CV)领域的卷积神经网络(CNN) ,然后出现考虑序列特征的循环神经网络(RNN ,包括 Encoder-Decoder 模型) ,直到 2017 年横空出世的 Transformer ,大概分这五个主要阶段 。因为本文的重点是 Transformer ,所以前面四个模型我会快速概览一下,然后介绍下最朴素的注意力(Attention)机制 ,基于此再详细介绍下 Transformer ,并对一个完整的 、精炼实现的代码实例进行精讲 。
第 1 节 · N 元文法语言模型
1.1 、马尔科夫假设(Markov Assumption)与 N 元文法语言模型(N-gram Language Model)下一个词出现的概率只依赖于它前面 n-1 个词,这种假设被称为「马尔科夫假设(Markov Assumption」。N 元文法 ,也称为 N-1 阶马尔科夫链 。
一元文法(1-gram) ,unigram ,零阶马尔科夫链 ,不依赖前面任何词; 二元文法(2-gram) ,bigram ,一阶马尔科夫链 ,只依赖于前 1 个词; 三元文法(3-gram) ,trigram ,二阶马尔科夫链 ,只依赖于前 2 个词; ……通过前 t-1 个词预测时刻 t 出现某词的概率 ,用最大似然估计:
P
(
w
t
∣
w
1
,
w
2
.
.
.
w
t
−
1
)
=
C
(
w
1
,
w
2
,
.
.
.
w
t
)
C
(
w
1
,
w
2
,
.
.
.
w
t
−
1
)
P(w_t | w_1,w_2...w_{t-1}) = \frac{C(w_1,w_2,...w_t)}{C(w_1,w_2,...w_{t-1})}
P(wt∣w1,w2...wt−1)=C(w1,w2,...wt−1)C(w1,w2,...wt)进一步地 ,一组词(也就是一个句子)出现的概率就是:
P
(
w
1
,
w
2
,
.
.
.
w
t
)
=
P
(
w
t
∣
w
1
,
w
2
,
.
.
.
w
t
−
1
)
⋅
P
(
w
t
−
1
∣
w
1
,
w
2
,
.
.
.
w
t
−
2
)
⋅
.
.
.
⋅
P
(
w
1
)
=
∏
i
=
1
t
−
1
P
(
w
i
∣
w
1
:
i
−
1
)
\begin{aligned} P(w_1,w_2,...w_t) &= P(w_t | w_1,w_2,...w_{t-1}) \cdot P(w_{t-1} | w_1,w_2,...w_{t-2}) \cdot ... \cdot P(w_1) \\ &= \displaystyle\prod_{i=1}^{t-1}P(w_i | w_{1:i-1}) \end{aligned}
P(w1,w2,...wt)=P(wt∣w1,w2,...wt−1)⋅P(wt−1∣w1,w2,...wt−2)⋅...⋅P(w1)=i=1∏t−1P(wi∣w1:i−1)为了解决句头 、尾逇概率计算问题,我们再引入两个标记 <BOS> 和 <EOS> 分别表示 beginning of sentence 和 end of sentence ,所以
w
=
w_0 =
w0= <BOS> 、w
l
e
n
g
t
h
+
1
=
w_{length + 1} =
wlength+1=<EOS> ,其中 length 是词的数量 。具体地,比如对于 bigram ,该模型表示如下:
P
(
w
1
,
w
2
,
.
.
.
w
t
)
=
∏
i
=
1
t
−
1
P
(
w
i
∣
w
i
−
1
)
P
(
w
t
∣
w
t
−
1
)
=
C
(
w
t
−
1
,
w
t
)
C
(
w
t
−
1
)
\begin{aligned} P(w_1,w_2,...w_t) &= \displaystyle\prod_{i=1}^{t-1}P(w_i | w_{i-1}) \\ P(w_t | w_{t-1}) &= \frac{C(w_{t-1}, w_t)}{C(w_{t-1})} \end{aligned}
P(w1,w2,...wt)P(wt∣wt−1)=i=1∏t−1P(wi∣wi−1)=C(wt−1)C(wt−1,wt) 如果有词出现次数为了 0 ,这一串乘出来就是 0 了 ,咋办? 因为基于马尔科夫假设 ,所以 N 固定窗口取值 ,对长距离词依赖的情况会表现很差 。 如果把 N 值取很大来解决长距离词依赖 ,则会导致严重的数据稀疏(零频太多了) ,参数规模也会急速爆炸(高维张量计算) 。上面的第一个问题 ,我们引入平滑 / 回退 / 差值等方法来解决 ,而后面两个问题则是在神经网络模型出现后才更好解决的 。
1.2、平滑(Smoothing)/ 折扣(Discounting)虽然限定了窗口 n 大小降低了词概率为 0 的可能性 ,但当 n-gram 的 n 比较大的时候会有的未登录词问题(Out Of Vocabulary ,OOV) 。另一方面 ,训练数据很可能也不是 100% 完备覆盖实际中可能遇到的词的 。所以为了避免 0 概率出现,就有了让零平滑过渡为非零的补丁式技术出现 。
最简单的平滑技术 ,就是折扣法(Discounting) 。这是一个非常容易想到的办法 ,就是把整体 100% 的概率腾出一小部分来,给这些零频词(也常把低频词一起考虑) 。常见的平滑方法有:加 1 平滑 、加 K 平滑 、Good-Turing 平滑、Katz 平滑等 。
1.2.1 、加 1 平滑 / 拉普拉斯平滑(Add-One Discounting / Laplace Smoothing)加 1 平滑 ,就是直接将所有词汇的出现次数都 +1 ,不止针对零频词 、低频词 。如果继续拿 bigram 举例来说 ,模型就会变成:
P
(
w
i
∣
w
i
−
1
)
=
C
(
w
i
−
1
,
w
i
)
+
1
∑
j
=
1
n
(
C
(
w
i
−
1
,
w
j
)
+
1
)
=
C
(
w
i
−
1
,
w
i
)
+
1
C
(
w
i
−
1
)
+
∣
V
∣
P(w_i | w_{i-1}) = \frac{C_(w_{i-1},w_i) + 1}{\displaystyle\sum_{j=1}^n(C_(w_{i-1},w_j) + 1)} = \frac{C(w_{i-1}, w_i) + 1}{C(w_{i-1}) + |\mathbb{V}|}
P(wi∣wi−1)=j=1∑n(C(wi−1,wj)+1)C(wi−1,wi)+1=C(wi−1)+∣V∣C(wi−1,wi)+1其中
N
N
N 表示所有词的词频之和 ,∣
V
∣
|\mathbb{V}|
∣V∣ 表示词汇表的大小。如果当词汇表中的词 ,很多出现次数都很小 ,这样对每个词的词频都 +1 ,结果的偏差影响其实挺大的 。换句话说 ,+1 对于低频词很多的场景 ,加的太多了 ,应该加一个更小的数( 1 < δ < 1) 。所以有了下面的「δ 平滑」技术。
1.2.2 、加 K 平滑 / δ 平滑(Add-K Discounting / Delta Smoothing)把 +1 换成 δ ,我们看下上面 bigram 模型应该变成上面样子:
P
(
w
i
∣
w
i
−
1
)
=
C
(
w
i
−
1
,
w
i
)
+
δ
∑
j
=
1
n
(
C
(
w
i
−
1
,
w
j
)
+
δ
)
=
C
(
w
i
−
1
,
w
i
)
+
δ
C
(
w
i
−
1
)
+
δ
∣
V
∣
P(w_i | w{i-1}) = \frac{C_(w_{i-1},w_i) + \delta}{\displaystyle\sum_{j=1}^n(C_(w_{i-1},w_j) + \delta)} = \frac{C(w_{i-1}, w_i) + \delta}{C(w_{i-1}) + \delta|\mathbb{V}|}
P(wi∣wi−1)=j=1∑n(C(wi−1,wj)+δ)C(wi−1,wi)+δ=C(wi−1)+δ∣V∣C(wi−1,wi)+δδ 是一个超参数 ,确定它的值需要用到困惑度(Perplexity,一般用缩写 PPL) 。另外 ,有些文章里也会把这个方法叫做「加 K 平滑 ,Add-K Smoothing」 。
1.2.3 、困惑度(Perplexity)对于指定的测试集,困惑度定义为测试集中每一个词概率的几何平均数的倒数 ,公式如下:
PPL
(
D
t
e
s
t
)
=
1
P
(
w
1
,
w
2
.
.
.
w
n
)
n
\operatorname{PPL}(\mathbb{D}_{test}) = \frac{1}{\sqrt[n]{P(w_1,w_2...w_n)}}
PPL(Dtest%3创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!