使用社交账号登录
linear / relu / sgd -> tokenization -> LLM workflow -> inference / deployment
神经网络本质上不是神秘黑盒,而是很多简单函数的组合。
最基础的一条链可以写成:
x -> Linear -> ReLU -> Linear -> loss -> backward -> SGD step
nn.Linear 做的是一个仿射变换。
它会把输入特征映射到新的特征空间。
例如:
in_featuresout_featuresLinear 层本身有参数weight 和 bias如果一个模型里只有线性层,那么无论叠多少层,整体仍然只是一个线性变换。 这意味着模型表达能力有限,不能表示复杂函数。
所以,神经网络真正变强的关键,不只是“层数变多”,而是:
在线性层之间加入非线性。
ReLU(x) = max(0, x)
也就是:
ReLU 是非线性激活函数。 加入 ReLU 后,模型就不再只是简单线性变换的堆叠,而可以表达更复杂的函数关系。
SGD(Stochastic Gradient Descent)做的事情是:
也就是:
因为它通常不是每次用整个数据集精确计算梯度, 而是只用当前一个 batch 来近似当前梯度。
学习率过大:
学习率过小:
语言模型不能直接处理原始文本。 文本在进入模型之前,必须先被转换成模型能处理的离散单位和数字表示。
这个过程就是 tokenization。
最小视角下,tokenizer 做两件事:
token 是模型输入的基本单位。 在现代 LLM 中,token 往往既不是完整单词,也不是单个字符,而更常是 subword(子词)。
如果按完整单词切分:
如果按单个字符切分:
所以现代 tokenizer 通常在两者之间取折中,使用 subword。
需要认识 3 个名字:
它们的共同目标都是:
在控制词表大小的同时,尽可能保留有意义的文本片段。
对于中文、日文、韩文,tokenizer 通常不会简单按空格切分, 而更可能按字符边界、子词规则,或者直接在原始文本上学习切分方式。
所以:
除了普通文本 token,tokenizer 通常还会管理一些特殊 token,例如:
这说明模型输入不只是正文 token,还包含一些控制信息。
token 数会直接影响:
所以 tokenizer 不是一个无关紧要的文本前处理步骤, 它实际上是模型系统的一部分。
LLM(Large Language Model)是在大量文本数据上训练出来的语言模型。 它可以理解和生成文本,并且在不做任务专门训练的情况下,处理很多语言任务。
这里要注意:
training / pretraining:
fine-tuning:
inference:
deployment / serving:
做 LLM 不只是看 transformer 结构或者参数量。
一个真实的 LLM 工作流还包括:
也就是说:
模型只是系统的一部分,不是全部。
训练脚本的职责是:
而部署需要的是:
所以训练代码和部署代码不是一回事。
一个最小推理脚本通常需要:
model.eval()如果是文本模型,还通常需要:
model.eval() 在部署里很重要推理阶段一般需要稳定、可复现的输出。
如果不切到 eval():
这会导致推理结果不稳定。
所以部署时通常会写:
最小 Web demo 的核心不是“服务器”,而是:
input -> predict_function -> output
也就是说,本质上你只需要先写一个预测函数,然后再把它包装成界面或接口。
这里最关键的是:
fn:预测函数inputs:输入类型outputs:输出类型input -> prediction function -> output。Linear 层在做什么model.eval()import torch
from torch import nn
linear = nn.Linear(4, 2)
x = torch.randn(3, 4)
y = linear(x)
print("x shape:", x.shape)
print("y shape:", y.shape)import torch
from torch import nn
relu = nn.ReLU()
x = torch.tensor([[-1.0, 0.5, 2.0]])
y = relu(x)
print("before relu:", x)
print("after relu:", y)param = param - lr * gradfrom transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")
text = "I like machine learning."
encoded = tokenizer(text)
print("input_ids:", encoded["input_ids"])
print("tokens:", tokenizer.convert_ids_to_tokens(encoded["input_ids"]))data -> tokenizer -> model -> training/fine-tuning -> inference -> serving -> agentmodel.eval()
with torch.no_grad():
output = model(x)import gradio as gr
def predict(text):
return f"you entered: {text}"
demo = gr.Interface(
fn=predict,
inputs="text",
outputs="text"
)
demo.launch()