大模型面试知识点整理(一)

本帖是为了整理大模型/transformer面试常见的问题,以及自己面试会遇到的问题。

知识点来源1:

大模型八股答案(一)——基础知识 - suc16的文章 - 知乎

https://zhuanlan.zhihu.com/p/643829565

内容:

attention 手写公式:

Q = xWq, K  = xWk, V = xWv

attention(Q,K,V) = softmax(QK^T/sqrt(d_k))V

transformer里的是多头注意力,会多一个输出权重矩阵,所以一共有4个矩阵(把各个头的attention结果concat后过一层linear)

如下图,有一个linear的网络

hidden size: 一般也是embedding的维度,以及每一个头的隐藏维度。一般从4096到8192。

手写一个scaled dot product attention:

def scaled_dot_product_attention(self, q,k,v):

        n, q_len, h_dim = q.shape

        attention = torch.bmm(q, k.transpose(-2, -1))/math.sqrt(h_dim)

        attention = attention.softmax(dim=-1)

        output = torch.bmm(attention, v)

        return output, attention

       

对于GQA:多了一个组内重复的动作。

q = self.q_proj(query).reshape(bs, q_len, self.num_heads, self.head_dim).transpose(1,2).reshape(-1, q_len, self.head_dim)

k=self.k_proj(key).repeat_interleave(self.num_key_value_groups, dim=0).reshape(***).transpose(1,2).reshape(***)

v=****

output, attention=self.scaled_dot_product_attention(q,k,v)

...

class llama_attention:

def __init__:

self.q_proj = nn.linear(self.hidden_size, self.num_heads * self.head_dim )

self.k_proj=...
self.v_proj=...

self.o_proj=nn.linear(self.num_heads * self.head_dim, self.hidden_size)

def forward(past_key_value = None):

if past_key_value is not None:

#上一轮的k和v可以复用

#每次decode,都是把问题+上一轮的回答作为输入去预测下一个token,直到遇到终止符。(问:这里的question prompt也输入在里面吗)

key_state = torch.cat([past_key_value[0], key_state], dim = 2)

value_state = torch.cat([past_key_value[1], value_state], dim = 2)

attention_weights = torch.matmul(q, k.transpose(2,3))/math.sqrt(head_dim)

#在这里加上attention mask

if attention_mask is not None: 

attn_weights = attn_weights + attention_mask

#dtype_min = torch.tensor( torch.finfo(attn_weights.dtype).min, device=attn_weights.device, dtype=attn_weights.dtype )

#attn_weights = torch.max(attn_weights, dtype_min)

# 计算softmax,这里需要从fp16升为fp32 # upcast attention to fp32

attn_weights = nn.functional.softmax(attn_weights, dim=-1, dtype=torch.float32).to(query_states.dtype)

attn_output = torch.matmul(attn_weights, value_states)

attn_output = attn_output.transpose(1, 2)

attn_output = attn_output.reshape(bsz, q_len, self.hidden_size)

attn_output = self.o_proj(attn_output)

if not output_attentions:

        attn_weights = None

past_key_value = (key_state, value_state)

return attn_output, attn_weights, past_key_value

位置编码:

正弦余弦编码:PE(pos,2k) = sin(pos/10000^2k/d_model)

pos 【0,max_len-1】

k:[0, d_model-1]

llama里用的是旋转位置编码RoPE。向量的内积就会引入位置信息。

BBPE可以通过组合字节对的方法表示词表范围以外的中文字符,如llama。那是否可以所有模型通用一个分词器

呢?答案是不可以,因为在中文语料上训练,一个token可以表示两个以上汉字,而上面的方法一个汉字可能需要3个token表示,影响表示效率。

这里错了,bpe和bbpe的区别在于,bbpe是深入到字节层面表示的,因此可以在跨语言表示时不需要专门扩充词表。但是如果遇到非ascii文字较多的情况,表示的token数量还是会过多,从而导致序列过长,推理速度较慢。

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
"Java高级架构面试知识点整理.pdf"是一份关于Java高级架构的面试知识点的文档。该文档主要包括以下几个方面的内容: 1. Java多线程和并发:讲解Java中的多线程概念、线程安全性、线程的生命周期和状态转换、线程同步与锁、并发工具类(如CountDownLatch、Semaphore等)、线程池等相关知识点。 2. JVM与GC算法:了解Java虚拟机(JVM)的基本原理、内存结构和内存模型,理解垃圾回收(GC)算法的原理和常见的垃圾回收器(如Serial、Parallel、CMS、G1等),掌握GC调优的一般方法。 3. 分布式架构和并发编程模型:认识分布式系统的基本概念、CAP定理、分布式存储和分布式计算的方案,了解常见的并发编程模型(如Actor模型、异步编程等)和实现方式。 4. 高性能网络编程:熟悉Java NIO的基本原理、底层实现和使用方式,了解Java网络编程的相关API和概念(如Socket、ServerSocket、Selector等),了解基于Netty框架的高性能网络编程。 5. 分布式消息队列和中间件:了解消息队列的基本概念、常见的消息中间件(如RabbitMQ、Kafka等)的特点和使用场景,理解消息队列的高可用、持久化、消息顺序等特性。 6. 微服务和服务治理:理解微服务的概念、优劣势和架构特点,了解微服务的拆分和组织原则,熟悉常见的服务治理框架(如Spring Cloud、Dubbo等)和相关的技术组件。 7. 高可用和容灾设计:掌握高可用架构的设计原则和常见的高可用技术方案(如集群、负载均衡、故障切换等),了解容灾方案的设计和实现方法,学习如何保证系统的可靠性和稳定性。 8. 性能优化与调优:了解性能优化的基本思路和方法,熟悉性能调优的一般流程和工具,掌握常见的性能调优技术(如缓存、异步、批处理等)和优化手段。 以上就是对于"Java高级架构面试知识点整理.pdf"文档的简要回答,希望对您有所帮助。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值