LLM 八股
LLM 面试题简单记录一下面试过程中问到的八股文吧
Decoder-only的LLM大模型中,FFN是什么样的结构?答:一个2层的全连接网络,维度是先扩大4倍,再缩小为原来的1/4。
为什么FFN网络是先做宽,再做窄?(这一题我也没回答好)答:FFN通过增加中间层的维度,扩展了输入的表示空间。这种维度扩展有助于模型更好地学习输入序列的表示,从而提高了模型的性能。通常,FFN包括两个线性层,中间层的维度通常比输入向量的维度大,然后通过激活函数,最后再缩减回输入维度的维度。这个过程有助于模型更好地捕捉输入信息中的复杂性。先升维,将特征进行各种类型的特征组合,提高模型分辨能力;再降维,去除区分度低的组合特征。
修改multi-head attention中head的个数,会影响参数量吗?答:不会。一般来说,隐藏层的维度d_model,head的个数num_head,以及每个head的输出维度dim_head,满足这样一个关系:d_model = num_head * dim_head。num_head增加时,dim_head也会相应减少。其次,代码实现上来说,每个h ...
MHA, MQA, GQA
MHA (Multi-Head Attention)我们知道多头注意力机制(MHA)是Transformer中一个非常重要的部分。相比与单头注意力机制,MHA将query,key,value分别映射到不同的子空间,从而每个头可以从不同的角度来学习特性,增加网络的表征能力。
这听起来很美好,但现实很残酷,由于大模型在推理时,是一个一个token进行推理输出的,所以当需要推理的文本很长时,那么推理计算的时间复杂度就会上升,为了降低时间复杂度,提升推理速度,我们有了KV-Cache技术。这是一种空间换时间的技巧,(后续有机会再详细掰扯)。KV-Cache确实可以提升推理速度,但是代价就是需要的显存变多了。为了降低显存,只能降低参数量,于是乎MQA(Multi-Query Attention)被提出来了。
MQA(Multi-Query Attention)MQA的想法非常简单,就是原来每个head,都对应一组query,key,value矩阵,那么现在让不同的head都共享同一个key,value矩阵,这样不就减少了key和value矩阵的参数量了吗。举例来说:假设一个输入$x$的维度为(1 ...
MultiHeadAttention 代码实现
本文主要对MultiHeadAttention,给出一个Pytroch版本下的实现
回顾一下MultiHeadAttention的公式。
scaled dot product attention:$$\text{Attention}(Q,K,V) = softmax\left(\frac{Q K^{\top}}{\sqrt{d}}\right)V \tag{1}$$
Head output:$$head_i = \text{Attention}(QW^{Q}_i, KW^{K}_i, VW^{V}_i) \tag{2}$$
Multihead attention:$$\text{MultiHead}(Q,K,V) = \text{Concat}(head_1, \ldots, head_h) \tag{3}$$
第一种实现1234567891011121314151617181920212223242526272829303132333435363738394041424344454647import torchimport torch.nn.f ...
LLaMA 大语言模型
背景自从openAI提出scaling law之后,大家发现很多模型都满足一定的scaling law,由于scaling law可以通过小规模的模型性能来预测大规模的模型性能,scaling law也变得越来越重视。J. Hoffmann 在《Training Compute-Optimal Large Language Models》论文给出了计算资源最优情况下的scaling law,这里的最优指的是训练。事实上训练最优并不代表推理最优,因为此时模型参数可能会比较大,但其实在小一点的模型上同样可以实现相同的性能。这就是LLaMA提出的初衷:LLaMA期望在小模型上训练更多的数据来达到更好的性能。
LLaMA-1 模型结构LLaMA-1 模型结构特点如下:
使用RMSNorm
对$Q, K$ 使用RoPE旋转式位置编码
使用causal mask保证每个位置只能看到前面的tokens
FFN部分使用SwiGLU 激活函数
context window 长度为2048
下面依次来介绍一下这几个特点
RMSNorm一般的layernorm公式如下所示:$$\hat{x}_i & ...
Transformer
Transformer自从 2017 年 Google 发布一篇名为《Attention is all you need》的论文,基于transformer的网络模型便层出不穷,特别是以 Bert 和 GPT 为代表的一些语言模型实现了在多种NLP领域任务上超前的性能 ,更是将transformer的热度带向的顶峰。
2023年,openAI推出的基于GPT4的ChatGPT,其在多个领域都展现出高水平的智能,更是让人们相信基于Transformer这条路可以实现强人工智能。
Transformer 结构
Transformer主要是由Encoder和Decoder组成,这两部分的结构很相似,主要构成成分是注意力层(Attention Layer)。本文主要是对Transformer这一结构做出一定介绍,网上其实已经有很多介绍了,但很多时候并不是很全面和清晰,笔者在学习的时候发现想找一个全面介绍并不是很容易。
输入对于LLM(large language model)其本质的输入是一段文本,然后输出也是一段文本,我们的目的就是学习一个文本到文本的映射$\textbf{Y} = ...
数值优化
数值优化无论是机器学习还是深度学习,本质上都是求解一个输入到输出的最好的映射,那么这里的“最好”的定义根据不同场景,任务目标也会有所不同。给出“最好”的定义之后,那么就需要去求解最优的映射,这个求解的过程,就是数值优化。本篇博客主要是介绍数值优化的一些基础概率和基本算法,更为高深的数值算法,这里不在赘述。
上溢和下溢严格来说,在计算机里所有的数都是离散的,并且是有限的,其离散化的精度和所表示数的范围,都是有限的。举个例子来说,用64个比特位来表示整数,其能表示的整数范围为[-9223372036854775808, 9223372036854775807],虽然这个范围很大,但并不是无穷的。同理如果用64个个比特位来表示浮点数,那么所能表示的浮点数个数也是有限的,所以这里就存在舍入误差。
为了更直观的看到舍入误差,这里举一个例子,以4个比特位为例子,前两个表示浮点数的整数部分,后两个比特位来表示浮点数的小数部分。比如1.2就可以用0110来表示,其中01是整数部分1的二进制表示,而后面的10则是小数部分2的二进制表示。但是这样的4个比特位,其表示的浮点数的能力非常有限。因为我们很容易就 ...
深度学习环境搭建
前言本篇博客主要是帮助读者搭建windows下深度学习的环境。
简介windows下深度学习的环境搭建主要包括五个部分,分别是显卡驱动,cuda,cudnn,anaconda 和pytorch。
显卡驱动想要搭建深度学习的环境,首先是需要一张显卡(虽然也可用CPU来做训练卡,但是CPU没有为深度学习做优化加速,训练性能远不如GPU)。一般来说Nvida显卡更加普及一些,所以就以Nvida显卡为例。如果电脑里已经安装了显卡驱动(一般都已经装好了),可以进行第二步cuda安装。
如何确定是否有显卡驱动呢?非常简单,同事按下WI+X键,再按下M键,或者在电脑左下角搜索框输入设备管理器,打开设备管理器点击显示适配器,如下图所示图上显示的NVIDIA GeForce GTX 1660 Ti就是你的显卡,点击右键选择属性,再点击驱动程序一栏,如果可以打开,并显示了版本号,则说明显卡驱动已经安装完成,请移步第二步。
如果打不开或者无法显示则需要安装显卡驱动。可以进入NVIDA官网下载最新的驱动,在下图中输入你的相关信息,然后开始搜索驱动,选择一个驱动版本进行下载并安装。
CUDACUDA(Compu ...
深度学习-深度前馈网络
前言随着alpha-go和Chatgpt的出现,人工智能(Artificial Intelligence,AI)展现出令人惊叹的发展前景,作为一个科技工作者(新时代民工),应该对其要有所了解的。深度学习作为人工智能领域一个非常重要的课题,自然是不能错过的。
笔者之前也对深度学习了解较少,但工作上遇到了一些问题,发现用深度学习的一些方法可以很好的解决,所以想工作之余系统性的学习一下。《Deep Learning》,I. Goodfellow, Y. Bengio and A. Courville作为深度学习领域非常著名的一本书,虽然已经有些过时,但确实打基础的一本好书。笔者会从中挑选一些章节阅读并分享。
深度前馈网络绝大多数深度学习问题都可以总结为,给定一个输入 $x$,我们设计网络可以输出预期的 $y$。也就是说,我们期望可以学习到这个未知的映射 $f^*:x \rightarrow y=f^*(x)$。深度前馈网络(deep feedforward network),也叫作前馈神经网络(feedforward neural network)或者多层感知机(multilaye ...