- 代码实现
- 实现卷积层
- CrossEntropyLoss
- 实现nn.seqential
- 机器学习
- 有哪些超参数调优方法
- 模型评估中有哪些方法,优缺点有什么
- 什么是A/B测试,有什么作用
- 如何进行A/B测试
- 余弦距离是否为一个严格定义的距离
- 在怎样的场景下使用余弦相似度而不是欧氏距离
- ROC曲线是什么
- 如何计算AUC
- ROC曲线和P-R曲线有什么区别特点
- 准确率(Accuracy)精准率(Precision)召回率(Recall)均方根误差(RMSE)区别和局限
- 生成方法和判别方法区别
- 过拟合应该如何处理
- 对于类别数据应该如何处理
- KL散度是什么
- 交叉熵是什么、
- 人工智能、机器学习、深度学习区别
- 特征工程是什么
- 为什么要做归一化、哪些类型数据需要做
- 归一化和标准化区别
- 深度学习
- 深度学习优势
- 卷积网络
- 卷积下一层大小如何计算,padding和stride有什么作用
- 卷积运算
- 什么是感受野、怎样计算感受野
- 一维卷积是什么
- 卷积网络变种有哪些
- 卷积网络和全连接层的区别
- 卷积神经网络近年来的结构设计上的主要发展和变迁
学习中记得一些笔记:来源:李沐老师《动手学习深度学习_pytorch版本》、李航老师《统计学习方法》、葫芦娃《百面机器学习》《百面深度学习》、网络各种资料。现在是在做笔记,待做完以后再重新整理归类。实时更新。 代码实现 实现卷积层
import torch
import torch.nn as nn
def corr2d(X: torch.tensor, K: torch.tensor) -> torch.tensor:
"""
步长为1、卷积核大小小于输入大小
:param K: 卷积核
:param X: 输入
:return: 卷积后输出
"""
n_h, n_w = X.shape
k_h, k_w = K.shape
re = torch.zeros((n_h - k_h + 1, n_w - k_w + 1))
for i in range(re.shape[0]):
for j in range(re.shape[1]):
re[i][j] = (X[i:i + k_h, j:j + k_w] * K).sum()
return re
# test
X = torch.tensor([[0.0, 1.0, 2.0], [3.0, 4.0, 5.0], [6.0, 7.0, 8.0]])
K = torch.tensor([[0.0, 1.0], [2.0, 3.0]])
print(corr2d(X, K))
tensor([[19., 25.],
[37., 43.]])
class Cov2d(nn.Module):
def __init__(self, kernel_size):
super().__init__()
self.weight = nn.Parameter(torch.randn(kernel_size))
self.bais = nn.Parameter(torch.zeros(1))
def forward(self, x):
return corr2d(x, self.weight) + self.bais
net = Cov2d([2, 2]) print(net(X))CrossEntropyLoss
o
j
o_j
oj为为归一化预测的
o
o
o的第
j
j
j个元素。
y
^
j
=
s
o
f
t
m
a
x
(
o
)
=
e
x
p
(
o
j
)
∑
k
e
x
p
(
o
k
)
hat y_j=softmax(o)=frac{exp(o_j)}{sum_{k}exp(o_k)}
y^j=softmax(o)=∑kexp(ok)exp(oj)
这里就会发现当
o
j
o_j
oj 足够大时数值会上溢出。一般处理方法是
o
j
−
m
a
x
(
o
)
o_j-max(o)
oj−max(o)。这样softmax公式就变成了:
s
o
f
m
a
x
(
o
)
=
e
x
p
(
o
j
−
m
a
x
(
o
)
)
∑
k
e
x
p
(
o
k
−
m
a
x
(
o
)
)
sofmax(o)=frac{exp(o_j-max(o))}{sum_{k}{exp(o_k-max(o))}}
sofmax(o)=∑kexp(ok−max(o))exp(oj−max(o))
这样有效防止上溢出。
但对于之后求损失函数:
l
=
−
∑
k
y
i
l
o
g
(
y
^
i
)
l=-sum_{k}{y_ilog(hat y_i)}
l=−k∑yilog(y^i)
l
=
−
l
o
g
(
y
^
i
)
l=-log(hat y_i)
l=−log(y^i)
当
y
^
i
hat y_i
y^i足够小时便会下溢出那么对于原公式进行化简:
l
=
−
l
o
g
(
e
x
p
(
o
j
)
∑
k
e
x
p
(
o
k
)
)
l=-log(frac{exp(o_j)}{sum_{k}exp(o_k)})
l=−log(∑kexp(ok)exp(oj))
l
=
−
o
j
+
l
o
g
(
∑
k
e
x
p
(
o
k
)
)
l=-o_j+log({sum_{k}exp(o_k)})
l=−oj+log(k∑exp(ok))
import torch
import torch.nn as nn
from torch.nn import functional as F
class MySequential(nn.Module):
def __init__(self, *arg):
super().__init__()
for block in arg:
self._modules[block] = block
def forward(self, x):
for block in self._modules.values():
x = block(x)
return x
验证
net = MySequential(nn.Linear(20, 30), nn.ReLU(), nn.Linear(30, 2)) x = torch.randn((2, 20)) net(x)
输出:
tensor([[ 0.2447, -0.0728],
[ 0.0344, -0.3802]], grad_fn=)
这里nn.ReLU 和F.ReLU其实我感觉没有区别。(如果有的话请指正) 距离的定义:在一个集合中如果每一对元素克为宜确定一个实数,使得三条距离公里成立(正定性,对称性,三角不等式)成立,则该实数可称为这对元素之间的距离。 KL散度也不满足三角定理 向量A,B的余弦相似度为
A
⋅
B
∣
∣
A
∣
∣
2
∣
∣
B
∣
∣
2
frac{Acdot B}{vertvert Avertvert_2||B||_2}quad
∣∣A∣∣2∣∣B∣∣2A⋅B欧式距离为
∣
∣
A
−
B
∣
∣
2
||A-B||_2
∣∣A−B∣∣2,所以能够发现余弦距离大小与向量本身大小无关,所以在计算类似于文本相似度时两段文本类容相似但段落不一致,如果使用词向量或者词频作为特征计算欧斯距离可能较大、但余弦相似度较小。并且欧斯距离和纬度大小相关。 ROC曲线是Receiver Operating Characteristic Curve简称。中文为“受试者工作特性曲线”。(最初源于医学领域) AUC是ROC曲线下的面积大小。该值能够量化反应基于ROC曲线衡量出的模型性能。 ROC的横轴:
F
P
/
N
FP/N
FP/N纵轴:
T
P
/
P
TP/P
TP/P和P-R曲线横轴:
T
P
/
P
TP/P
TP/P纵轴
:
T
P
/
(
F
P
+
T
P
)
:TP/(FP+TP)
:TP/(FP+TP) 判别方法:数据直接学习决策函数f(x)或者条件概率分布
p
(
y
∣
x
)
p(y|x)
p(y∣x)作为预测模型。该方法关心给定输入x,应该预测什么样的输出y。(KNN、感知机、决策树、逻辑斯蒂回归、SVM等) 两种方法: 常用的三种方法: 除此以外还有Helmert Contrast、Sum Contrast、Polynomial Contrast等。 又称相对熵、是衡量相同空间中两个概率分布相对差距的测度。两个概率
p
(
x
)
p(x)
p(x)和
q
(
x
)
q(x)
q(x)的KL散度为:
D
(
p
∣
∣
q
)
=
∑
x
∈
X
p
(
x
)
l
o
g
p
(
x
)
q
(
x
)
D(p||q)=sum_{xin X}p(x)logfrac{p(x)}{q(x)}quad
D(p∣∣q)=x∈X∑p(x)logq(x)p(x) 用于衡量估计模型和真是概率分布之间的差异。 人工智能泛指让机器具有人的智力的技术。 对原始数据进行处理将其提炼为特征。从本质上讲特征工程是一个表现和展示数据的过程。实际工作生产中,特征工程指的是去除原始数据中的杂质和冗余。 是各个特征之间具有可比性(统一量纲)。使模型能够更容易通过梯度下降找到最优解。 主要方法有线性归一化。 决策树不需要归一化因为其计算的是信息增益比,信息增益比和特征是否归一化无关。 归一化会改变数据的原始距离、分布和信息。标准化不会。 能够处理人们并不完全懂得问题,也更加擅长处理含噪声或不完全的数据。 通常,垂直padding为
p
h
p_h
ph当垂直步幅为
s
h
s_h
sh 、水平padding为
p
w
p_w
pw水平步幅为
s
w
s_w
sw 时,输出形状为
⌊
(
n
h
−
k
h
+
p
h
+
s
h
)
/
s
h
⌋
×
⌊
(
n
w
−
k
w
+
p
w
+
s
w
)
/
s
w
⌋
.
lfloor(n_h-k_h+p_h+s_h)/s_hrfloor times lfloor(n_w-k_w+p_w+s_w)/s_wrfloor.
⌊(nh−kh+ph+sh)/sh⌋×⌊(nw−kw+pw+sw)/sw⌋. 其实严格意义不能叫做卷积运算而应该叫做互相关运算,因为在实际卷积中是输入张量和卷积张量进行互相关运算产生张量。
0
×
0
+
1
×
1
+
3
×
2
+
4
×
3
=
19
,
1
×
0
+
2
×
1
+
4
×
2
+
5
×
3
=
25
,
3
×
0
+
4
×
1
+
6
×
2
+
7
×
3
=
37
,
4
×
0
+
5
×
1
+
7
×
2
+
8
×
3
=
43.
0times0+1times1+3times2+4times3=19,\ 1times0+2times1+4times2+5times3=25,\ 3times0+4times1+6times2+7times3=37,\ 4times0+5times1+7times2+8times3=43.
0×0+1×1+3×2+4×3=19,1×0+2×1+4×2+5×3=25,3×0+4×1+6×2+7×3=37,4×0+5×1+7×2+8×3=43. 对于某层输出特征图上某个点,在卷积网络的原始输入数据上能够影响到这个点的取值的区域。 普通卷积可以转化为矩阵乘法。 MLP是输出层每个节点于输入层每个节点都有连接。
x
ˊ
=
{
1
,
x
>threshold
0
,
x
模型评估中有哪些方法,优缺点有什么
通过对目标函数形状进行学习,找到使目标函数向全局最优值提升的参数。具体而言就是根据先验分布,假设一个搜集函数;然后每一次使用新的采样点来测试目标函数时,利用这个信息来更新目标函数的先验分布。最后算法测试有后验分布给出全局值最有可能出现的位置的点。
什么是A/B测试,有什么作用
将原始样本的样本集合随即划分成训练集和验证集两部分。
缺点是在验证集上计算的最后评估指标与原始分组有很大关系。
k-fold交叉验证:将样本分为k部分大小相等的子集;依次遍历这些子集,遍历到的子集作为验证集,其余作为训练集,将得到结果取均值作为最终评估指标。
留一验证:每次留一个样本作为验证集。
前两种方法,当样本量较少时划分训练集验证集会使得训练数据减少。自助法:对于总数n的样本集合,进行n次有放回的随机抽样,得到大小为n的训练集。n次采样过程中(可以重复抽取),没有抽取出来的样本作为验证集。
知乎解释
原因:
如何进行A/B测试
余弦距离是否为一个严格定义的距离
d
i
s
t
(
A
,
B
)
≥
0
dist(A,B)geq 0
dist(A,B)≥0
证明:
d
i
s
t
(
A
,
B
)
=
1
−
c
o
s
(
θ
)
=
∣
∣
A
∣
∣
2
∣
∣
B
∣
∣
2
−
A
B
∣
∣
A
∣
∣
2
∣
∣
B
∣
∣
2
≥
0
dist(A,B)=1-cos(theta)=frac{||A||_2||B||_2-AB}{||A||_2||B||_2}quadgeq0
dist(A,B)=1−cos(θ)=∣∣A∣∣2∣∣B∣∣2∣∣A∣∣2∣∣B∣∣2−AB≥0
d
i
s
t
(
A
,
B
)
=
d
i
s
t
(
B
,
A
)
dist(A,B)=dist(B,A)
dist(A,B)=dist(B,A)
这个证明略。
d
i
s
t
(
A
,
B
)
+
d
i
s
t
(
B
,
C
)
≥
d
i
s
t
(
A
,
C
)
dist(A,B)+dist(B,C)geq dist(A,C)
dist(A,B)+dist(B,C)≥dist(A,C)
等号在共线时取得。
给定三个点
A
=
(
1
,
0
)
,
B
=
(
1
,
1
)
,
C
=
(
0
,
1
)
A=(1,0),B=(1,1),C=(0,1)
A=(1,0),B=(1,1),C=(0,1)则有:
d
i
s
t
(
A
,
B
)
=
1
−
2
2
d
i
s
t
(
B
,
C
)
=
1
−
2
2
d
i
s
t
(
A
,
C
)
=
1
d
i
s
t
(
A
,
B
)
+
d
i
s
t
(
B
,
C
)
≤
d
i
s
t
(
A
,
C
)
dist(A,B)=1-frac{sqrt{2}}{2}quad\dist(B,C)=1-frac{sqrt{2}}{2}quad\dist(A,C)=1\dist(A,B)+dist(B,C)leq dist(A,C)
dist(A,B)=1−22
dist(B,C)=1−22
dist(A,C)=1dist(A,B)+dist(B,C)≤dist(A,C)
欧
氏
距
离
:
∣
∣
A
−
B
∣
∣
2
余
弦
相
似
度
:
c
o
s
(
A
,
B
)
余
弦
距
离
:
1
−
c
o
s
(
A
,
B
)
欧氏距离:||A-B||_2\余弦相似度:cos(A,B)\余弦距离:1-cos(A,B)
欧氏距离:∣∣A−B∣∣2余弦相似度:cos(A,B)余弦距离:1−cos(A,B)
具体选择视情况而定。
ROC横坐标为假阳性率
F
P
R
=
F
P
N
FPR=frac{FP}{N}quad
FPR=NFP。纵坐标为真阳性率
T
P
R
=
T
P
P
TPR=frac{TP}{P}quad
TPR=PTP真阳性率也是召回率。
在正负样本分布发生变化时ROC曲线基本保持不变,P-R曲线一般会发生较大变化。所以ROC能够更稳定反应模型本省好坏。P-R能够看到模型在特定数据集上的表现。
生成方法和判别方法区别
当出现样本类别不平衡时这类方法无法有效区分、比如正样本1000个负样本10个只要预测时全为正样本就可以让正确率99%。
单独用精准率和召回率进行评估是不准确的,因此也引入了F1值。
为此可以使用平均绝对比五擦汗提高鲁棒性。
M
A
P
E
=
∑
i
=
1
n
∣
y
i
−
y
i
^
y
i
∣
×
100
n
MAPE=sum_{i=1}^nmidfrac{y_i-hat{y_i}}{y_i}mid times frac{100}{n}
MAPE=i=1∑n∣yiyi−yi^∣×n100该方法相当于对每个误差点进行归一化。
生成方法:生成模型由数据学生西联合概率分布
p
(
x
,
y
)
p(x,y)
p(x,y)然后求出概率条件分布
p
(
y
∣
x
)
p(y|x)
p(y∣x)作为预测模型。模型表示了给定输入x产生输出y的生成关系(朴素贝叶斯法和隐马尔可夫模型)
对于类别数据应该如何处理
简化模型(非线性模型变为线性模型)、添加约束(结构风险最小化、正则化)、集成学习、Dropout超参数等。
数据扩充:对原始数据适当变换达到扩充数据的效果。
随机变量
X
∽
p
(
x
)
Xbacksim p(x)
X∽p(x),模型
q
(
x
)
q(x)
q(x)用于近似
p
(
x
)
p(x)
p(x)的分布,
H
(
X
,
q
)
=
H
(
X
)
+
D
(
p
∣
∣
q
)
=
−
∑
x
∈
X
p
(
x
)
l
o
g
q
(
x
)
=
E
p
(
l
o
g
1
q
(
x
)
)
H(X,q)=H(X)+D(p||q)\=-sum_{xin X}p(x)logq(x)\=E_p(logfrac1{q(x)})
H(X,q)=H(X)+D(p∣∣q)=−x∈X∑p(x)logq(x)=Ep(logq(x)1)
机器学习指计算机通过观察环境(学习数据特征)自我更新进步。
深度学习是机器学习的一种方法。基于神经网络。
上图来源
x
ˊ
=
x
−
x
m
i
n
x
m
a
x
−
x
m
i
n
acute x=frac{x-x_{min}}{x_{max}-x_{min}}quad
xˊ=xmax−xminx−xmin
标准化有些地方也叫零均值归一化
x
ˊ
=
x
−
x
ˉ
σ
acute x=frac{x-bar x}{sigma}quad
xˊ=σx−xˉ
使用场景:
卷积运算
截图:李沐老师动手学习深度学习
假设·输入的二维大小为
n
h
×
n
w
n_htimes n_w
nh×nw卷积核为
k
h
×
k
w
k_htimes k_w
kh×kw 输出大小为:
(
n
h
−
k
h
+
1
)
×
(
n
w
−
k
w
+
1
)
(n_h-k_h+1)times (n_w-k_w+1)
(nh−kh+1)×(nw−kw+1)(步长为1,不带padding(也就是卷积核能够全部遍历且不溢出的情况))。
y
=
A
x
y=Ax
y=Ax
x,y为卷的输入输出(展平为一维向量的形式)维度分别为
d
(
i
)
和
d
o
d^{(i)}和 d^{o}
d(i)和do,A是由卷积核、滑动步长决定的长对角矩阵维度为
d
0
×
d
i
d^{0}times d^{i}
d0×di,其每一行对应着卷积核的一次滑动位置。
定义一维输入向量
x
=
[
a
,
b
,
c
,
d
,
e
,
f
,
g
]
T
x=[a,b,c,d,e,f,g]^T
x=[a,b,c,d,e,f,g]T,卷积核为
K
=
[
x
,
y
,
z
]
K=[x,y,z]
K=[x,y,z],设卷积的滑动步长为2,则输出向量为:
y
=
[
a
x
+
b
y
+
c
z
c
x
+
d
y
+
e
z
e
x
+
f
y
+
g
z
]
=
[
x
y
y
z
0
0
0
0
0
0
x
y
y
z
0
0
0
0
0
0
x
y
y
z
]
[
a
b
c
d
e
f
g
]
=
A
x
y=begin{bmatrix} ax+by+cz \ cx+dy+ez \ ex+fy+gz\ end{bmatrix}=begin{bmatrix} x&y&y&z&0&0&0&0 \0&0&x&y&y&z&0&0\ 0&0&0&0&x&y&y&z\ end{bmatrix}begin{bmatrix} a\ b\ c\ d\e\f\g\end{bmatrix}\=Ax
y=⎣⎡ax+by+czcx+dy+ezex+fy+gz⎦⎤=⎣⎡x00y00yx0zy00yx0zy00y00z⎦⎤⎣⎢⎢⎢⎢⎢⎢⎢⎢⎡abcdefg⎦⎥⎥⎥⎥⎥⎥⎥⎥⎤=Ax
卷积网络和全连接层的区别
x
^
和
y
^
hat{x}和hat{y}
x^和y^为转置卷积的输入和输出。起作用:1.转置卷积能够将普通卷积中输入到输出的尺寸变换逆反。2.转置卷积的信息正向传播与普通卷积的反向传播所用矩阵相同。实现对特征图进行扩展或者上采样。
卷积神经网络具有局部连接和权值共享
卷积核通过对输入的多通道特征图进行扫描和运算。
卷积神经网络近年来的结构设计上的主要发展和变迁
为什么要权值共享:百度百科:另外,换个角度理解为什么权值要固定,比如我有个曲线的特征过滤器,那么这个过滤器在扫描全图的时候,我们想要提取出所有的曲线区域,是不是这个过率器不能变?如果在上半部分过滤器是曲线,到下半部分变成了直线,那么在图像上下区域内提取出来的曲线特征是真正的曲线吗?个人认为从这个直白的角度更容易理解。
百面深度学习:权值共享降低内存和计算复杂度。
采用同一个尺寸的卷积核和池化层。网络更深
将网络中的大模块替换成由多个卷积层组成的多分支结构。数学依据是,大型稀疏矩阵可以分解成多个稠密小矩阵。Inception模块会使用
1
×
1
、
3
×
3
、
5
×
5
1times1、3times3、5times5
1×1、3×3、5×5三种卷积核进行多路特征提取。是的网络稀疏化的同时,增强网络对多尺寸特征的适应性。
随着网络层数增加,网络的训练误差和测试误差都会上升。称为网络退化(degeneration)。其与过拟合是不同的。其采用了跳层连接(shortcut connection)。



