2025年自然语言处理课程自我评价
简介
- 西南财经大学-23级-人工智能(智能金融实验班)
自我评价
阅读书籍 & 心得
- 97分
1.《Foundations of Statistical Natural Language Processing》
9-10月
这本书主要讲解了统计自然语言处理的核心框架,把语言任务统一为概率建模与推断问题,围绕语言模型与平滑、序列标注的隐马尔可夫模型HMM、最大熵等判别式模型,以及信息检索与分布式语义等内容,说明如何用数据估计参数并用算法完成建模。
大致看了这本书的一半,对 N-gram 理解更加深刻了,明白为什么需要平滑,如何处理长尾和 OOV,在思考问题中多了 Kneser-Ney 的思维,同时自己做了一点关于 TF-IDF 的实验(有点感兴趣)。同时,这本书首次给我提供了 NLP 的建模思维,理解平滑、正则化等本质上是在用归纳偏置提高泛化能力。这个过程中,我用了其中建模的思维和困惑度的概念,完成了挑战题(用 gpt2 比较哪个 PPL 更低)。
2.《Introduction to Information Retrieval》
9-10月
这本书主要讲信息检索的整体流程与核心方法,从文档表示与倒排索引出发,系统介绍基于词项权重的向量空间模型与 TF-IDF、基于概率的检索模型与 BM25、语言模型检索的基本思想,并进一步覆盖查询处理与优化、文本分类与聚类、评测指标体系以及搜索系统的工程实现要点。
在做分词和了解 TF-IDF 的时候了解到了这本书,大致看了一部分,了解到预处理时规范化、停用词等方法,在 TF-IDF 基础上升级为 BM25,它平衡了长短文章得分差距,减少噪声干扰等。(基于此完成了一个小爬虫项目,爬取了去哪儿网站信息,做快速检索)
3.《Attention Is All You Need》等突破性文章
10-11月
比如 Bert, GPT, Scaling Laws, RLHF 系列, word2vec, Seq2Seq, Glove等等,这里我通过 AI 讲解方式并对照原文完成学习的,在学习 NLP 过程中这些讲解能让我理解课程内容更深刻,比如最初不理解词向量内涵,通过文章以及一些代码理解了 token 是怎么编码训练的词向量,能让语义相近的词,词向量也相近。在这个过程中 Glove 的思想给我留下印象深刻,在后续做一个情感分析 LDL 任务时,设计共现矩阵时我没有采用预处理的方式,而是用这个方式在训练中拟合。这样设计下,结果显著提升。
- 扣分原因:对于更多新的论文,我有所听闻,但由于时间原因,很多新的文章我还不太了解,更多现代的 SOTA 等还有待探索。
成果及贡献
- 99分
- RNN(LSTM、GRU、BiLSTM、BiGRU)
- Transformer(位置编码、多头注意力、LN、双层FFN等调整 R-drop,FGM等添加内容)
- 预训练模型(RoBERTa,DeBERTa,DistilBERT,ALBERT,Llama 3,Gemma3,gpt,CLIP)
以上模型都在编程过程中写过,无论是从头开始手写还是直接继承类,或多或少 coding 过,预训练模型(调用API)在不同任务中思考了选择不同预训练模型的优势。(9-12月)
这里展示一个通过 label 来关注文本 token 的注意力上的创新代码(12月):
class LabelAttentionHead(nn.Module):
def __init__(self, hidden: int, n_heads: int = 8, dropout: float = 0.1):
super().__init__()
self.hidden = hidden
self.n_heads = n_heads
assert hidden % n_heads == 0
self.head_dim = hidden // n_heads
self.q_proj = nn.Linear(hidden, hidden, bias=False)
self.k_proj = nn.Linear(hidden, hidden, bias=False)
self.v_proj = nn.Linear(hidden, hidden, bias=False)
self.out_proj = nn.Linear(hidden, hidden, bias=False)
self.dropout = nn.Dropout(dropout)
def forward(self, label_emb: torch.Tensor, token_states: torch.Tensor, attn_mask: torch.Tensor):
B, L, H = token_states.size()
C = label_emb.size(0)
Q = self.q_proj(label_emb).view(C, self.n_heads, self.head_dim) # [C, nh, hd]
K = self.k_proj(token_states).view(B, L, self.n_heads, self.head_dim) # [B, L, nh, hd]
V = self.v_proj(token_states).view(B, L, self.n_heads, self.head_dim)
Qb = Q.unsqueeze(0).permute(0, 2, 1, 3) # [1, nh, C, hd]
Kt = K.permute(0, 2, 1, 3) # [B, nh, L, hd]
scores = torch.matmul(Qb, Kt.transpose(-2, -1)) / math.sqrt(self.head_dim) # [B, nh, C, L]
mask = (attn_mask == 0).unsqueeze(1).unsqueeze(2) # [B,1,1,L]
scores = scores.masked_fill(mask, -1e4)
attn = F.softmax(scores, dim=-1)
attn = self.dropout(attn)
Vt = V.permute(0, 2, 1, 3) # [B, nh, L, hd]
ctx = torch.matmul(attn, Vt) # [B, nh, C, hd]
ctx = ctx.permute(0, 2, 1, 3).contiguous().view(B, C, H) # [B, C, H]
ctx = self.out_proj(ctx)
return ctx
- CCKS2025-大模型生成文本检测(A榜:318/1094)7月
- Hull Tactical - Market Prediction(369/3678)11月
- MAP - Charting Student Math Misunderstandings 10月
以上是参加的一些有关比赛,不仅是为了取得好成绩,更多的是能通过比赛学习到别人处理问题的思路和更新的代码。
至于其他任务,平时通过 IMDB、GoEmotions 练习,深度学习上对 LDL 任务研究论文撰写,通过prompt方式构建 LDL 数据集,算法上有时候会有一些小创新,对于 only-encoder 和 only-decoder 任务都有一定研究。
这里用一个流程图描述一下其中一个任务的细节(12月):
- 得分原因:可能做的任务有点杂,也没有那么理想,但是之前从来没有接触过深度学习,神经网络的我来讲,通过一个学期收获的代码量,我认为足够了。
