NLP
0. 引言
您是否厌倦了人类之间使用离散语言的低效交流?您是否希望学习更加抽象且高效的表达方式,或者渴望与计算机建立更加连续的沟通?本门课程将从自然语言中单词的最基本表示——词向量开始讲起,详细讲解当前 $ NLP$ ( NaturalLanguageProcessing, 自然语言处理) 的主流模型 Transformer,并教授如何使用目前最热门的 NLP 模型托管平台 HuggingFace 🤗。
如果您觉得自己的语言表达过于离散,希望学习具有连续性的表达方式;或者认为自己的表达过于直白,缺乏高层次的抽象;或者希望在本地部署类 ChatGPT 语言模型,那么请将本课程压入您的运行栈。本课程虽无益于提升您作为人的表达能力,即教会您个人使用词向量表达并对高层次抽象语义特征进行提取,但可以使您的模型具有更加完备的自然语言理解与自然语言生成能力,从而在语言类任务中实现对您的代替。 在本课程中,您(或者您的模型,如果比您更智能的话)可以: 学习变形金刚的基本原理、结构,亲手组装并运行您的第一个变形金刚(模块无需自备)。了解大规模预训练语言模型的预训练、微调方法。 熟练掌握抱抱脸的使用场景与技巧。 对预训练语言模型进行微调,完成简单的文本任务。在学习完计算机视觉课程后,尝试使用多模态模型完成文本 & 图像任务。
1. 如何表示一个词的含义?

- 离散的 id 型词语如何输入到神经网络之中?
- 神经网络的输入对象通常是 feature -> 我们需要得到词的 featurexw
xw
🤗Word Embedding 词嵌入
- 将一个词映射为一个 embeddingdim 维的向量
- 每一维具有一定的含义(具体含义可能很抽象)

🤗如何获取 Word Embedding ?
2. 如何获取词在句子中的向量表示?
An Apple a Day Keeps the Doctor Away
一天一部 Iphone 让我与博士学位失之交臂?
一个简单的想法:将句中所有词的向量加权求和,表示词在句中的含义。
🤗Skip-Gram & CBOW
一个词的意思取决于相邻词

🤗TextCNN
使用卷积来聚合特征

🤗RNN
预测下一个词

🤗长距离依赖?

🤗Attention is all you need!

🤗Attention Probs
attention scores(vi,vj)=cos(Evi,Evj)- 使用 Softmax 归一化:
attention probs(vi,vj)=∑k=0sequence lengtheattention scores(vi,vk)eattention scores(vi,vj)
Eviinsentence=j=0∑seqlenattention probs(vi,vj)Ej🤗如何科学获取Attention Score?
Embedding 的余弦夹角:与 vi 相似的特征真的是 vi 需要的吗?🤔
• 假如句子为:🍎🍎🍎🍎🍎🍎🍎🍎🍎🍎🍎are good.
•与 E🍎 最接近的总是 E🍎,E🍎insentence= E🍎
Embedding→(Query,Key) 🤗🤗🤗
Query:想查询的特征
Key:想被查询的特征
attention scores(vi,vj)=cos(Evi,Evj)🤔 Attention
EmbeddingLinear(Query, Key, Value)
attention scores(vi,vj)=cos(Evi,Evj)
attention probs(vi,vj)=∑k=0sequence lengtheattention scores(vi,vk)eattention scores(vi,vj)
Vviinsentence=j=0∑seq lenattention probs(vi,vj)Vj
EviinsentenceLinearVviinsentence🤗 Attention
🤗 Attention
Input: Embeddingsshape=(seq len,embedding dim)
Q=Qproj(Embeddings)shape=(seq len,query dim)
K=Kproj(Embeddings)shape=(seq len,key dim),key dim=query dim
V=Vproj(Embeddings)shape=(seq len,value dim)
Attention Probs(Q,K)=softmax(dQKT)shape=(seq len,seq len)
Attention(Q,K,V)=softmax(dQKT)Vshape=(seq len,value dim)
Output=Oproj(Attention(Q,K,V))shape=(seq len,embedding dim)

🤗如何加入位置信息🧭?
Eviinput=Evi+PEpos3. 如何在模型中存储知识?
🤗模型中知识存在何处?
知识:Key−ValuePair:(K,V)
NeuralMemory,使用 x 查询 ki:
p(ki∣x)∝ekix
MN(x)=i=1∑dimp(ki∣x)⋅vi
K=[ki],V=[vi]
MN(x)=softmax(xKT)VFFN(x)=f(xKT)V🤗 Feedforward Neural Network
FFN(x)=f(xKT)V- f 一般使用 relu 或其变种
- 一般 innerhiddendim = 4embeddingdim
- 参数量:8×embeddingsdim2
- 从 Input 序列到 Output 序列——Seq2Seq
4. 如何基于以上原理构建语言模型?
语言模型:Pθ(w|context)
context:上下文
w:某个位置上的某个词的概率
自编码语言模型(如 BERT):
• “北京在北纬[MASK]度”,求[MASK]填词的概率分布:𝑃(•|北京在北纬[MASK]度)
自编码语言模型(如 GPT):
• “北京在北”,求下一个字的概率分布:𝑃(•|北京在北)
🤗 Encoder Only
- 从 Input 序列到分类输出—— Classification
- 典型模型:BERT

🤗 Decoder Only
- 从输入序列到输入序列的延长—— Generation
- 典型模型:GPT

🤗 Attention Types
- SelfAttention: QKV 来自同一序列


🤗 Multi Head Attention 🙂🙂🙂
(Q0,Q1,Q2,Q3)=Q=Qproj(Embeddings)Qi. shape=(seq len,num headembeddings dim)
(K0,K1,K2,K3)=K=Kproj(Embeddings)Ki. shape=(seq len,num headembeddings dim)
(V0,V1,V2,V3)=V=Vproj(Embeddings)Vi. shape=(seq len,num headembeddings dim)
Output=Oproj(Concat(Attention(Qi,Ki,Vi)))
参数量: 4×embeddings dim2
不同 Head 关注不同的语义关系

🤗 Group Query Attention

- LMHead:一个线性层,输入维度为 embeddingdim;输出维度为词表大小 vocabsize。
- 输出每个位置上各词未归一化的对数概率 logits:
Pθ(⋅∣context)=softmax(logits)- 左侧为 Encoder
- 右侧为 Decoder

🤗 Encoder
- BERT
- 一次前向传播即可计算出所有[MASK]的概率分布
- 文本理解任务

🤗 Decoder
- GPT
- 自回归生成:每次生成下一个词
- MaskedAttention:每个词做Attention时只能加权到之前的词
- 文本生成任务

🤗如何训练语言模型?
随机初始化权重𝜃
反复随机初始化权重𝜃,直到权重能较好地完成任务❌
使用大量人工标注文本对模型进行训练😧😧😧
使用大量无标注文本对模型进行训练🧐😉🤗
🤗预训练
MaskfillingorNexttokenprediction?
Maskfilling:
• 我是[MASK],[MASK]考试没有一次[MASK]。
θmax(Pθ(大学生|context)⋅Pθ(幼儿园|context⋅Pθ(参加|context))θmax(∏Pθ(next token∣prefix))=θmax(Pθ(大学生|我是)⋅Pθ(, |我是大学生))🤗如何使用语言模型完成具体下游任务?
- 反复随机初始化权重𝜃,直到权重𝜃能较好地完成任务❌
- 在预训练模型的基础上继续使用大量无标注文本训练😟
- 使用少量标注数据 (x,y) 模型进行训练🤗🤗🤗
例:分类任务
替换预训练模型中的 LMHead 为 ClassificationHead
ClassificationHead 输入维度为 embeddingdim
输出维度为类别数目 numlabels
然后直接拿去部署
使用标注的数据 (x,y) 进行训练
• x:文本;y:类别
🤗如何使用有限的硬件资源进行微调?
- LoRA:Low−RankAdaptation

🤗如何让语言模型更好的理解人类意图?
- 指令微调
- 使用人工标注的 (prompt,response) 对模型进行微调
- 强化学习
