1. 线性回归
1.1 模型
数据集的每一项称为样本(sample),每个样本有多个feature(
x
x
x),每个sample有对应的label(
y
y
y)。可以利用线性模型表征样本特征和标签的关系
y
^
=
∑
w
x
i
+
b
\hat{y}=\sum wx_i+b
y^=∑wxi+b。
此时求得的
y
^
\hat{y}
y^是通过样本特征和模型得到的预测值。
1.2 损失函数
w
w
w、
b
b
b作为线性模型的参数,需要求得合适的参数,使得所建构的模型合理,所以比较真实值
y
y
y和预测值
y
^
\hat{y}
y^,使得误差最小。这个函数可以是L1, L2或者其他函数,这里用mse举例。
L
=
(
y
^
−
y
)
2
L=(\hat{y}-y)^2
L=(y^−y)2。
1.3 优化方法
为了得到
w
w
w、
b
b
b参数的值,可以求解析解或者数值解。一般解析解比较难求(在模型复杂的情况下),这里求数值解。这里用梯度下降方法求解。
w
=
w
−
l
r
∗
∂
L
∂
w
w=w-lr*\frac{\partial L} {\partial w}
w=w−lr∗∂w∂L,
b
b
b更新同理。
1.4 pytorch实现
核心代码
def __init__(self, n_feature):
super(LinearNet, self).__init__() # call father function to init
self.linear = nn.Linear(n_feature, 1) # function prototype: `torch.nn.Linear(in_features, out_features, bias=True)`
def forward(self, x):
y = self.linear(x)
return y
net = LinearNet(num_inputs)
# train
for epoch in range(1, num_epochs + 1):
for X, y in data_iter:
output = net(X)
l = loss(output, y.view(-1, 1))
optimizer.zero_grad() # reset gradient, equal to net.zero_grad()
l.backward()
optimizer.step()
print('epoch %d, loss: %f' % (epoch, l.item()))
2. 多层感知机
2.1 基本样式
输入层,隐藏层,输出层。
2.2 激活函数
多个隐藏层之间如果只做仿射变换(线性),即使叠加仿射变换,会与单个全连接网络相似。因此加入非线性变换,比如Relu,sigmoid,tanh等。目前使用比较多的是Relu函数,后来有改进的leaky relu等。relu函数表达很简单,
y
=
m
a
x
(
x
,
0
)
y=max(x,0)
y=max(x,0)。导数为0(当
y
y
y为0)或1(当
y
=
x
,
x
>
0
y=x,x>0
y=x,x>0)。
2.3 pytorch实现
相较于linear model,增加层数,增加激活函数即可。
3. softmax
softmax函数用于多分类,将求得的值映射到(0,1)范围之内,由此判断属于哪一类。
4. nlp基础相关
对于nlp了解的很少,基本所有信息来自课程。
4.1 文本预处理
文本是一类序列数据,一篇文章可以看作是字符或单词的序列,本节将介绍文本数据的常见预处理步骤,预处理通常包括四个步骤:
1.读入文本
2.分词
3.建立字典,将每个词映射到一个唯一的索引(index)
4.将文本从词的序列转换为索引的序列,方便输入模型
我简单理解一下就是将文字取出词频高且重要的词,编号,编号和词需要对应。
4.2 语言模型
分词过后词是独立的,只有成了序列才能表达意思。所以要考虑这些词组成序列的概率即句子(or词组)是有含义的。
一段自然语言文本可以看作是一个离散时间序列,给定一个长度为
T
T
T的词的序列
w
1
,
w
2
,
.
.
.
w
t
w_1,w_2,...w_t
w1,w2,...wt,语言模型的目标就是评估该序列是否合理,即计算该序列的概率:
P
(
w
1
,
w
2
,
.
.
.
w
t
)
P(w_1,w_2,...w_t)
P(w1,w2,...wt)。
基于统计的语言模型,主要是元语法(n-gram)。
4.3 RNN模型
关于RNN模型,知乎有一篇文章写得特别好。
linkhttps://zhuanlan.zhihu.com/p/28054589