机器学习、人工智能、大数据学习中笔记
- 代码实现
- 机器学习
-
-
- EM算法
- 隐马尔可夫模型(HMM)是什么
- CRF是什么
- 决策树有哪些启发函数
- 决策树剪枝有哪些方法
- 有哪些优化函数
- 冲量法是什么
- PCA是什么
- 决策树的常用启发函数
- 有哪些超参数调优方法
- 模型评估中有哪些方法,优缺点有什么
- 什么是A/B测试,有什么作用
- 如何进行A/B测试
- 余弦距离是否为一个严格定义的距离
- 在怎样的场景下使用余弦相似度而不是欧氏距离
- ROC曲线是什么
- 如何计算AUC
- ROC曲线和P-R曲线有什么区别特点
- 准确率(Accuracy)精准率(Precision)召回率(Recall)均方根误差(RMSE)区别和局限
- 生成方法和判别方法区别
- 过拟合应该如何处理
- 对于类别数据应该如何处理
- KL散度是什么
- 交叉熵是什么、
- 人工智能、机器学习、深度学习区别
- 特征工程是什么
- 为什么要做归一化、哪些类型数据需要做
- 归一化和标准化区别
-
- 深度学习
学习中记得一些笔记:来源:李沐老师《动手学习深度学习_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))
实现nn.seqential
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=<AddmmBackward0>)
这里nn.ReLU 和F.ReLU其实我感觉没有区别。(如果有的话请指正)
x ˊ = { 1 , x >threshold 0 , x <threshold \acute x = \begin{cases} 1, & \text{$x$>threshold} \\ 0, & \text{$x$<threshold} \\ \end{cases} xˊ={
1,0,x>thresholdx<threshold
机器学习
EM算法
不完全数据: 观测随机变量Y
完全数据:观测随机变量Y和隐随机变量Z
含有隐变量Z的概率模型,目标是极大化观测变量Y关于参数 θ \theta θ的对数似然函数,即 m a x θ L ( θ ) \underset{\theta}{max}L(\theta) θmaxL(θ)
L ( θ ) = l o g P ( Y ∣ θ ) = l o g ∑ z P ( Y , Z ∣ θ ) = l o g ( P ( Y ∣ Z , θ ) P ( Z ∣ θ ) ) L(\theta)=logP(Y|\theta)=log\sum_zP(Y,Z|\theta)=log(P(Y|Z,\theta)P(Z|\theta)) L(θ)=logP(Y∣θ)=logz∑P(Y,Z∣θ)=log(P(Y∣Z,θ)P(Z∣θ))
L ( θ ) ≥ L ( θ ( i ) ) + ∑ Z P ( Z ∣ Y , θ ( i ) ) l o g P ( Y ∣ Z , θ ) P ( Z ∣ θ ) P ( Z ∣ Y , θ ( i ) ) P ( Y ∣ θ ( i ) ) L ( θ ) = B ( θ , θ ( i ) ) L(\theta)\geq L(\theta^{(i)})+\sum_ZP(Z|Y,\theta^{(i)})log\frac{P(Y|Z,\theta)P(Z|\theta)}{P(Z|Y,\theta^{(i)})P(Y|\theta^{(i)})}\\L(\theta)=B(\theta,\theta^{(i)}) L(θ)≥L(θ(i))+Z∑P(Z∣Y,θ(i))logP(Z∣Y,θ(i))P(Y∣θ(i))P(Y∣Z,θ)P(Z∣θ)L(θ)=B(θ,θ(i))
要使得 θ ( i + 1 ) \theta^{(i+1)} θ(i+1)使得 B B B最大就即:
θ ( i + 1 ) = a r g m a x θ ( L ( θ ( i ) ) + ∑ Z P ( Z ∣ Y , θ ( i ) ) l o g P ( Y ∣ Z , θ ) P ( Z ∣ θ ) P ( Z ∣ Y , θ ( i ) ) P ( Y ∣ θ ( i ) ) = a r g m a x θ ( ∑ Z P ( Z ∣ Y , θ ( i ) ) l o g P ( Y ∣ Z , θ ) P ( Z ∣ θ ) ) = ( ∑ Z P ( Z ∣ Y , θ ( i ) ) l o g P ( Y , Z ∣ θ ) ) \theta^{(i+1)}=\underset{\theta}{argmax}(L(\theta^{(i)})+\sum_ZP(Z|Y,\theta^{(i)})log\frac{P(Y|Z,\theta)P(Z|\theta)}{P(Z|Y,\theta^{(i)})P(Y|\theta^{(i)})}\\=\underset{\theta}{argmax}(\sum_ZP(Z|Y,\theta^{(i)})log{P(Y|Z,\theta)P(Z|\theta)})\\=(\sum_ZP(Z|Y,\theta^{(i)})log{P(Y,Z|\theta) }) θ(i+1)=θargmax(L(θ(i))+Z∑P(Z∣Y,θ(i))logP(Z∣Y,θ(i))P(Y∣θ(i))P(Y∣Z,θ)P(Z∣θ)=θargmax(Z∑P(Z∣Y,θ(i))logP(Y∣Z,θ)P(Z∣θ))=(Z∑P(Z∣Y,θ(i))logP(Y,Z∣θ))
隐马尔可夫模型(HMM)是什么
在马尔可夫模型中,每个状态代表了一个可观察的事件,所以,马尔可夫模型有时又称为可视马尔可夫模型(visible Markov model, VMM)。在隐马尔可夫模型(HMM)中我们不知道模型所经过的状态序列,只指导状态的概率函数,也就是说,观察到的事件是状态的随机函数,因此,该模型是一个双重随机过程。其中模型的状态转移过程是不可观察的,即隐蔽的,可观察事件的随机过程是隐蔽的状态转换过程的随机函数。
状态集合 Q = q 1 , q 2 , … , q N , ∣ Q ∣ = N Q={q_1,q_2,\dots ,q_N},\text{ } |Q|=N Q=q1,q2,…,qN, ∣Q∣=N
观测集合 V = v 1 , v 2 , … , v M , ∣ V ∣ = M V={v_1,v_2,\dots,v_M},\text{ } |V|=M V=v1,v2,…,vM, ∣V∣=M
状态序列 I = i 1 , i 2 , … , i T i t ∈ Q I={i_1,i_2,\dots,i_T}\text{ }i_t\in Q I=i1,i2,…,iT it∈Q
观测序列 O = o 1 , o 2 , … , o T o t ∈ V O={o_1,o_2,\dots, o_T}o_t\in V O=o1,o2,…,oTot∈V
状态转移矩阵 A = [ a i j ] \mathbf{A}=[a_{ij}] A=[aij]
在t时刻处于状态 q i q_i qi条件下,在 t + 1 t+1 t+1时刻转移到状态 q j q_j qj的概率: a i j = P ( i t + 1 = q j ∣ i t = q i ) a_{ij}=\mathbf{P}(i_t+1=q_j|i_t=q_i) aij=P(it+1=qj∣it=qi)
观察概率矩阵: B = [ b j ( k ) ] N × M B=[b_j(k)]_{N\times M} B=[bj(k)]N×M
在t时刻处于状态 q i q_i qi条件下生成观察 v k v_k vk的概率:
b j ( k ) = P ( o t = v k ∣ i t = q j ) b_j(k)=\mathbf{P}(o_t=v_k|i_t=q_j) bj(k)=P(ot=vk∣it=qj)
初始概率向量: π i = P ( i i = q i ) \pi_i=P(i_i=q_i) πi=P(ii=qi)
在时刻 t = 1 t=1 t=1处于状态 q i q_i qi的概率:
π i = P ( i 1 = q i ) \pi_i=P(i_1=q_i) πi=P(i1=qi)
隐马尔科夫模型 λ = ( A , B , π ) \lambda=(A,B,\pi) λ=(A,B,π)
隐马尔可夫模型需要满足两个条件:
- 齐次马尔可夫假设:在任意时刻 t t t的状态只依赖于时刻 t − 1 t-1 t−1
P ( i t ∣ i t − 1 , o t − 1 , … , i 1 , o 1 ) = P ( i t ∣ i t − 1 ) P(i_t|i_t-1,o_t-1,\dots,i_1,o_1)=P(i_t|i_t-1) P(it∣it−1,ot−1,…,i1,o1)=P(it∣it−1) - 观测独立性假设:任意时刻的观测只依赖于该时刻的状态。
P ( o t ∣ i T , o T , i T − 1 , … , i 1 , o 1 ) = P ( o t ∣ i t ) P(o_t|i_T,o_T,i_{T-1},\dots,i_1,o_1)=P(o_t|i_t) P(ot∣iT,oT,iT−1,…,i1,o1)=P(ot∣it)
- 隐马尔科夫模型三个基本问题:
- 概率计算
已知 λ = ( A , B , π ) 和 O = o 1 , o 2 , … , o T \lambda=(A,B,\pi)和O={o_1,o_2,\dots,o_T} λ=(A,B,π)和O=o1,o2,…,oT,计算 P ( O ∣ λ ) P(O|\lambda) P(O∣λ)
表示给定模型 λ \lambda λ和 t t t和之前的序列 O O O,且 o t o_t ot状态为 q i q_i qi的概率 - 学习
已知 O = o 1 , o 2 , … , o T O={o_1,o_2,\dots,o_T} O=o1,o2,…,oT,计算 λ ∗ = a r g m a x P ( O ∣ λ ) \lambda^*=\mathbf{argmax}P(O|\lambda) λ∗=argmaxP(O∣λ)
(得到观测序列重构模型 λ \lambda λ所以HMM为生成式模型) - 预测 (encoder)
已知 λ = ( A , B , π ) 和 O = o 1 , o 2 , … , o T \lambda=(A,B,\pi)和O={o_1,o_2,\dots,o_T} λ=(A,B,π)和O=o1,o2,…,oT计算 λ ∗ = a r g m a x P ( I ∣ O , λ ) \lambda^*=\mathbf{argmax}P(I|O,\lambda) λ∗=argmaxP(I∣O,λ)
已知模型和序列可以预测未来状态或者重构其他序列。
- 观测序列生成算法:
- 输入:隐马尔科夫模型 λ = ( A , B , π ) \lambda=(A,B,\pi) λ=(A,B,π),观测序列长度 T T T
- 输出:观测序列 O = o 1 , o 2 , … , o t , … , o T O={o_1,o_2,\dots,o_t,\dots,o_T} O=o1,o2,…,ot,…,oT
- 初始状态有 π \pi π产生状态 i 1 i_1 i1
- t = 1 t=1 t=1
- 由状态 i t i_t it的观测概率分布 b j ( k ) b_j(k) bj(k)生成 o t o_t ot
- 由状态 i t i_t it的状态转移分布 a i j a_{ij} aij生成