基本情况
本人男,于2019年6月硕士毕业,本科双非,硕士是中流985。毕业至今,一直在某中型互联网公司从事数据挖掘工作。
工作的主要内容是时间序列的异常检测与预测,涉及的技术栈:主Python,辅Java,数据库使用的是Clickhouse,Redis,MySQL,拥有大规模数据的处理能力,熟悉机器学习与深度学习的基础算法原理。工作方面,拥有从0到1的数据挖掘项目落地经验。
当前的想法是转大模型应用开发,基于预训练的大模型对相关领域赋能,本人当前的情况是熟悉Transformer的基本原理,日常的工作中一直有使用在线大模型提升效果,自己也部署过开源大模型,并对外提供服务。
若是有大佬愿意指点一二,恳请留言,不胜感激。
为什么要转大模型
- 当前从事的数据挖掘工作,让我对机器学习与深度学习有一定的认识,转大模型应用开发的话,有一定的理论基础,相当于选择了一个方向深入下去。
- 日常的工作中,有使用在线大模型辅助处理一些问题,发现确实能提升效率,而且改变了问题处理的基本流程,特别是提升了信息检索效率,因此感觉大模型技术在未来有更大的想象力。
- 大模型属于当前的新兴热门方向,相较于传统的软件开发、算法来说,更让我有热情。
大模型使用基本认识
在日常的工作中,发现大模型擅长处理重复量大的问题,对于复杂的问题,需要构建复杂的Prompt才能获取预期的效果,但是这个Prompt不能复用的话,对整体效率的提升也不大。大模型目前更适合当一个助手,不能参与决策,大模型给出的方案,你要是无法很快确认其有效性,那你必然要花时间去验证它的有效性,这也是低效率的。
注意力机制
最后放一个注意力机制的计算公式吧。
$$ Attention(Q,K,V)=softmax(\frac{QK^T}{\sqrt{d_k} } )V $$
import numpy as np
import torch
from torch import nn
from my_transformer.config import args
class ScaledDotProductAttention(nn.Module):
""" 缩放点积注意力 """
def __init__(self):
super(ScaledDotProductAttention, self).__init__()
def forward(self, Q, K, V, attn_mask):
scores = torch.matmul(Q, K.transpose(-1, -2)) / np.sqrt(args.d_k)
# 隐码占位符
scores.masked_fill_(attn_mask, -1e9)
attn = nn.Softmax(dim=-1)(scores)
context = torch.matmul(attn, V)
return context, attn
class MultiHeadAttention(nn.Module):
""" 多头注意力 """
def __init__(self):
super(MultiHeadAttention, self).__init__()
self.W_Q = nn.Linear(args.d_model, args.d_k * args.n_heads, bias=False)
self.W_K = nn.Linear(args.d_model, args.d_k * args.n_heads, bias=False)
self.W_V = nn.Linear(args.d_model, args.d_v * args.n_heads, bias=False)
self.fc = nn.Linear(args.n_heads * args.d_v, args.d_model, bias=False)
def forward(self, input_Q, input_K, input_V, attn_mask):
residual, batch_size = input_Q, input_Q.size(0)
Q = self.W_Q(input_Q).view(batch_size, -1, args.n_heads, args.d_k).transpose(1, 2)
K = self.W_K(input_K).view(batch_size, -1, args.n_heads, args.d_k).transpose(1, 2)
V = self.W_V(input_V).view(batch_size, -1, args.n_heads, args.d_v).transpose(1, 2)
attn_mask = attn_mask.unsqueeze(1).repeat(1, args.n_heads, 1, 1)
context, attn = ScaledDotProductAttention()(Q, K, V, attn_mask)
context = context.transpose(1, 2).reshape(batch_size, -1, args.n_heads * args.d_v)
output = self.fc(context)
return nn.LayerNorm(args.d_model)(output + residual), attn