常见激活函数

作用:激活函数是来向神经网络中引入非线性因素的,通过激活函数,神经网络就可以拟合各种曲线

1.sigmoid

一般应用在二分类的输出层

缺点

​ 1.sigmoid 极容易导致梯度消失问题,可以从导数曲线可以看出,绝大多数的导数值为0

​ 2.Sigmoid 函数的输出不是以零为中心的(non-zero-centered),这会导致神经网络收敛较慢,详细原因请参考 https://liam.page/2018/04/17/zero-centered-active-function/

2.softmax

和sigmoid关系:Softmax函数是二分类函数Sigmoid在多分类上的推广

https://zhuanlan.zhihu.com/p/356976844

3.tanh

优点:

​ 1.tanh解决了sigmoid中的 zero-centered 问题

缺点

​ 2.对于梯度消失问题依旧无能为力。

4.Relu系列

4.1 Relu

优点:

​ 1.可以缓解梯度消失,因为导数在正数部分是恒等于1的

缺点

​ 1.Relu的输出不是zero-centered

​ 2.由于负数部分导数恒为0,会导致一些神经元无法激活,叫做Dead ReLU Problem

4.2 leaky Relu

leaky Relu就是为了解决Relu的0区间带来的影响,其数学表达为:

其中$k$是为超参数,一般数值较小,比如0.01

4.3 Elu

Elu激活函数也是为了解决Relu的0区间带来的影响,其数学表达为:

Elu相对于leaky Relu来说,计算要更耗时间一些

参考

https://zhuanlan.zhihu.com/p/44398148

https://liam.page/2018/04/17/zero-centered-active-function/

https://www.cnblogs.com/tornadomeet/p/3428843.html

https://www.cnblogs.com/chamie/p/8665251.html

https://zhuanlan.zhihu.com/p/33006526?from_voters_page=true

过拟合,欠拟合以及解决办法

1.偏差和方差

a.偏差

期望输出与真实标记的差别称为偏差(bias),即

b.方差

c.噪声

d.泛化误差(error)

2.过拟合、欠拟合与偏差、方差的关系

欠拟合:模型不能适配训练样本,有一个很大的偏差。

过拟合:模型很好的适配训练样本,但在测试集上表现很糟,有一个很大的方差。

3.如何解决过拟合和欠拟合

a.模型能力(一个模型参数数量不同,不同模型)

b.正则化

正则化参数出现的目的其实是防止过拟合情形的出现;如果我们的模型已经出现了欠拟合的情形,就可以通过减少正则化参数来消除欠拟合

c.特征数量

欠拟合:增加特征项

过拟合:减少特征项

d、训练的数据量

欠拟合:减少数据量

过拟合:增加数据量

参考

https://zhuanlan.zhihu.com/p/38853908

https://blog.csdn.net/hurry0808/article/details/78148756

https://blog.csdn.net/cltcj/article/details/119155683

数据不平衡如何解决

1.基于数据

a.过采样和欠采样

对少数数据进行有放回的过采样,使原本的数据变的均衡,这样就是对少数数据进行了复制,容易造成过拟合。

对多数数据进行有放回/无放回的欠采样,这样会丢失一些样本,损失信息,模型只学会整体模式的一部分,容易欠拟合。

b.SMOTE算法

c.数据增强

通过人为或算法增加少数数据的数量

2.基于loss

使用代价函数时,可以增加小类样本的权值,降低大类样本的权值

参考

https://zhuanlan.zhihu.com/p/62877337

https://blog.csdn.net/asialee_bird/article/details/83714612

梯度爆炸、梯度消失和解决方法

1.梯度

设二元函数$z=f(x,y)$ 在平面区域$D$上具有一阶连续偏导数,则对于每一个点$P(x,y)$的梯度为

2.BP算法图示

3.梯度消失和梯度爆炸

梯度爆炸和梯度消失问题都是因为网络太深网络权值更新不稳定造成的,本质上是因为梯度反向传播中的连乘效应。

举个例子,现有如上链式连接的网络$(x\rightarrow z \rightarrow y)$

假设$g$为sigmoid,那么$g^{‘}(z)$最大值为$\frac{1}{4}$,而我们初始化的网络权值通常都小于1,所以$g^{‘}(z)w \le \frac{1}{4}$,因此对于上面的链式求导,层数越多,求导结果$\frac{\partial C }{\partial b_1}$越小,因而导致梯度消失的情况出现。

这样,梯度爆炸问题的出现原因就显而易见了,当$w$比较大的时候或者激活函数的梯度较大,即$g^{‘}(z)w > 1$,层数越多,求导结果$\frac{\partial C }{\partial b_1}$越大,直到爆炸。

4.梯度消失和梯度爆炸解决方法

4.1 解决梯度消失

1.用ReLU、Leaky-ReLU、P-ReLU、R-ReLU、Maxout等替代sigmoid函数。

2.用Batch Normalization。

3.LSTM的结构设计也可以改善RNN中的梯度消失问题。

4.残差网络

5.合适的初始化权重

4.2解决梯度爆炸

1.梯度剪切:对梯度设定阈值

2.权重正则化(L1 和 L2 )

3.合适的初始化权重

参考

https://www.analyticsvidhya.com/blog/2021/06/the-challenge-of-vanishing-exploding-gradients-in-deep-neural-networks/

https://zhuanlan.zhihu.com/p/25631496

https://aijishu.com/a/1060000000100195

极大似然估计

1.定义

就是利用已知的样本结果信息,反推最具有可能导致这些样本结果出现的模型参数值。换句话说,即:“模型已定,结果已知,反推参数”。

2.极大似然构造损失函数

大多数常见的损失函数就是基于极大似然推导的。例子参考 https://www.cnblogs.com/hello-ai/p/11000899.html

判别模型下的极大似然估计

最大似然估计很容易扩展到估计条件概率$P\left (y|x;\theta \right)$,从而给定$x$预测$y$。实际上这是最常见的情况,因为这构成了大多数监督学习的基础。如果$X$表示所有的输入,$Y$表示我们观测到的目标,那么条件最大似然估计是:

如果假设样本是独立同分布的,那么这可以分解成

生成模型下的极大似然估计

考虑一组含有m个样本的数据集$X = \left \{ x^{(1)}, …, x^{(m)} \right \}$,由$p_{data}(x)$生成,独立同分布

对独立同分布的样本,生成样本集$X$的概率如下:

对$\theta$的最大似然估计被定义为:

多个概率的乘积公式会因很多原因不便于计算。例如,计算中很可能会因为多个过小的数值相乘而出现数值下溢。为了得到一个便于计算的等价优化问题,两边取对数:

可以发现,使用极大似然估计时,每个样本$x^{(i)}$都希望拉高它所对应的模型概率值$p_{model}(x^{(i)};\theta)$,如上图所示,但是由于所有样本的密度函数$p_{model}(x^{(i)};\theta)$的总和必须是1,所以不可能将所有样本点都拉高到最大的概率,一个样本点的概率密度函数值被拉高将不可避免的使其他点的函数值被拉低,最终的达到一个平衡态。我们也可以将上式除以$m$,便可以看到极大似然法最大化的目标是在经验分布$\widehat{p}_{data}$下样本概率对数的期望值,即

参考

https://zhuanlan.zhihu.com/p/26614750

https://www.cnblogs.com/hello-ai/p/11000899.html

https://blog.csdn.net/hustqb/article/details/77168436

https://zhuanlan.zhihu.com/p/273246971

熵,KL散度,交叉熵,JS散度

GAN需要KL散度和JS散度,所以先预热。

1.熵

信息量为:

熵为信息量的算术平均:

2.交叉熵

交叉熵为

3.KL散度

对于同一个随机变量有两个单独的概率分布,我们可以使用KL散度(Kullback-Leibler divergence)来衡量两个分布的差异。在机器学习的损失函数的计算中,我们可以假设$P$为样本的真实分布,$Q$用来表示模型所预测的分布,使用KL散度来衡量两个分布之间的差异。KL散度等于交叉熵减去熵

$P$和$Q$概率分布越接近,$D_{KL}(P||Q)$越小。

KL散度与交叉熵区别与联系

https://blog.csdn.net/Dby_freedom/article/details/83374650

KL散度主要有两个性质:

(1)不对称性

尽管KL散度从直观上是个距离函数,但它并不是一个真正的度量,因为它不具有对称性,即$D_{KL}(P||Q)\neq D_{KL}(Q||P)$。

(2)非负性

即$D_{KL}(P||Q) \geq 0$。

4.JS散度

JS散度也是用于度量两个概率分布的相似度,其解决了KL散度不对称的缺点

不同于KL主要在两方面:

(1)值域范围

JS散度的值域范围是[0,1],相同则是0,相反为1。

(2)对称性

即$ JS(P||Q)=JS(Q||P)$,从数学表达式中就可以看出。

参考

https://www.cnblogs.com/Mrfanl/p/11938139.html

https://zhuanlan.zhihu.com/p/346518942

https://www.w3cschool.cn/article/83016451.html

TensorFlow,pytorch,cuda,cudnn,显卡驱动之间的区别以及对应关系

一.概念理解

显卡驱动连接操作系统与底层硬件。

CUDA和NVIDIA的显卡驱动程序完全是两个不同的概念。CUDA是NVIDIA推出的用于自家GPU的并行计算框架,也就是说CUDA只能在NVIDIA的GPU上运行,而且只有当要解决的计算问题是可以大量并行计算的时候才能发挥CUDA的作用。CUDA的本质是一个工具包(ToolKit)。

cuDNN是一个SDK,是一个专门用于神经网络的加速包,注意,它跟我们的CUDA没有一一对应的关系,即每一个版本的CUDA可能有好几个版本的cuDNN与之对应,但一般有一个最新版本的cuDNN版本与CUDA对应更好。

TensorFlow为谷歌推出的深度学习框架,pytorch是Facebook 推出的深度学习框架。

二.版本对应关系

深度学习框架基于GPU运算效率远高于CPU,但是需要满足框架的版本和cuda,cudnn以及显卡驱动版本匹配才可以正常工作。

tensorflow

pytorch

cuDNN与CUDA

CUDA和NVIDIA显卡驱动关系

三.常用命令

查看GPU型号

1
lspci | grep -i nvidia

查看NVIDIA驱动版本

1
cat /proc/driver/nvidia/version

Python 查看pytorch版本、判断CUDA是否可用

1
2
3
import torch 
print(torch.__version__)
print(torch.cuda.is_available())

查看cuda版本

1
2
cat /usr/local/cuda/version.txt
conda list | grep cuda

Tensorflow中查看GPU是否可用

1
2
import tensorflow as tf
tf.test.is_gpu_available()

四.参考文献

https://blog.csdn.net/caiguanhong/article/details/112184290

分类任务的衡量指标

一、二分类

1.1 confusion matrix

1.2 accuracy

accuracy 衡量全局分类正确的数量占总样本的比例

1.3 precision

precision为预测正确正样本数占预测的全部正样本数的比例,即系统判定为正样本的正确率。通俗地说,假如医生给病人检查,医生判断病人有疾病,然后医生判断的正确率有多少。

1.4 recall

recall为预测正确的正样本数量占真实正样本数量的比例,即衡量正样本的召回比例。通俗说,假如有一批病人,医生能从中找出病人的比例

1.5 F1

由于precision和recall往往是矛盾的,因此为了综合考虑二者,引入F1,即为precision和recall的调和平均

当$precision$和$recall$的任一个值为0,$F_1$都为0

之所以采用调和平均,是因为调和平均数受极端值影响较大,更适合评价不平衡数据的分类问题

通用的F值表达式:

除了$F_1$分数之外,$F_2$ 分数和$F_{0.5}$分数在统计学中也得到大量的应用。其中,$F_2$分数中,召回率的权重高于精确率,而$F_{0.5}$分数中,精确率的权重高于召回率。

1.6 ROC

roc曲线:接收者操作特征(receiver operating characteristic), roc曲线上每个点反映某个阈值下的FPR和TPR的组合。

横轴:$FPR$,叫做假正类率,表示预测为正例但真实情况为反例的占所有真实情况中反例的比率,公式为$FPR=\frac{FP}{TN+FP}$。

纵轴:$TPR$ ,叫做真正例率,表示预测为正例且真实情况为正例的占所有真实情况中正例的比率,公式为​

$TPR=\frac{TP}{TP+FN}$。

1.7 AUC

$AUC$(Area under Curve):ROC曲线下的面积,数值可以直观评价分类器的好坏,值越大越好,对于二分类,结果介于0.5和1之间,1为完美分类器,0.5是因为二分类分类效果最差也是0.5。

二、多分类

2.1 混淆矩阵

2.2 accuracy

2.3 某个类别的precision,recall,F1

与二分类公式一样

2.4 系统的precision,recall,F1

系统的precision,recall,$F_1$需要综合考虑所有类别,即同时考虑猫、狗、猪的precision,recall,$F_1$。有如下几种方案:

2.4.1 Macro average

2.4.2 Weighted average

对macro的推广

2.4.3 Micro average

2.5 ROC

对于多分类分类器整体效果的ROC如上micro或者macro曲线,其余3条描述单个类别的分类效果。对于多分类,ROC上的点,同样是某个阈值下的FPR和TPR的组合。

对于多分类的$FPR$,$TPR$,有几种计算方式

a. micro average

b. macro average

2.6 AUC

$AUC$依旧为ROC曲线下的面积,对于多分类个人认为取值范围为[0,1]。

三.代码

accuracy,precision,recall,F1

1
2
3
4
5
from sklearn.metrics import precision_recall_fscore_support, accuracy_score
def eval_acc_f1(y_true, y_pred):
acc = accuracy_score(y_true, y_pred)
prf = precision_recall_fscore_support(y_true, y_pred, average="macro")
return acc, prf

ROC和AUC

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
# 引入必要的库
import numpy as np
import matplotlib.pyplot as plt
from itertools import cycle
from sklearn import svm, datasets
from sklearn.metrics import roc_curve, auc
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import label_binarize
from sklearn.multiclass import OneVsRestClassifier
from scipy import interp

# 加载数据
iris = datasets.load_iris()
X = iris.data
y = iris.target
# 将标签二值化
y = label_binarize(y, classes=[0, 1, 2])
# 设置种类
n_classes = y.shape[1]

# 训练模型并预测
random_state = np.random.RandomState(0)
n_samples, n_features = X.shape

# shuffle and split training and test sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.5,random_state=0)

# Learn to predict each class against the other
classifier = OneVsRestClassifier(svm.SVC(kernel='linear', probability=True,
random_state=random_state))
y_score = classifier.fit(X_train, y_train).decision_function(X_test)

# 计算每一类的ROC
fpr = dict()
tpr = dict()
roc_auc = dict()
for i in range(n_classes):
fpr[i], tpr[i], _ = roc_curve(y_test[:, i], y_score[:, i])
roc_auc[i] = auc(fpr[i], tpr[i])

# Compute micro-average ROC curve and ROC area(方法二)
fpr["micro"], tpr["micro"], _ = roc_curve(y_test.ravel(), y_score.ravel())
roc_auc["micro"] = auc(fpr["micro"], tpr["micro"])

# Compute macro-average ROC curve and ROC area(方法一)
# First aggregate all false positive rates
all_fpr = np.unique(np.concatenate([fpr[i] for i in range(n_classes)]))
# Then interpolate all ROC curves at this points
mean_tpr = np.zeros_like(all_fpr)
for i in range(n_classes):
mean_tpr += interp(all_fpr, fpr[i], tpr[i])
# Finally average it and compute AUC
mean_tpr /= n_classes
fpr["macro"] = all_fpr
tpr["macro"] = mean_tpr
roc_auc["macro"] = auc(fpr["macro"], tpr["macro"])

# Plot all ROC curves
lw=2
plt.figure()
plt.plot(fpr["micro"], tpr["micro"],
label='micro-average ROC curve (area = {0:0.2f})'
''.format(roc_auc["micro"]),
color='deeppink', linestyle=':', linewidth=4)

plt.plot(fpr["macro"], tpr["macro"],
label='macro-average ROC curve (area = {0:0.2f})'
''.format(roc_auc["macro"]),
color='navy', linestyle=':', linewidth=4)

colors = cycle(['aqua', 'darkorange', 'cornflowerblue'])
for i, color in zip(range(n_classes), colors):
plt.plot(fpr[i], tpr[i], color=color, lw=lw,
label='ROC curve of class {0} (area = {1:0.2f})'
''.format(i, roc_auc[i]))

plt.plot([0, 1], [0, 1], 'k--', lw=lw)
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Some extension of Receiver operating characteristic to multi-class')
plt.legend(loc="lower right")
plt.show()

参考资料:

https://blog.csdn.net/Orange_Spotty_Cat/article/details/80520839

https://zhuanlan.zhihu.com/p/147663370

https://zhuanlan.zhihu.com/p/81202617

https://zhuanlan.zhihu.com/p/266386193


:D 一言句子获取中...