P= 分类正确的正样本数 / 分类器预测正样本的个数
P:预测20人患癌,其中有8人真实患癌
R = 分类正确的正样本数 / 真正的正样本个数
R:真实发生了,10人真实患癌,预测出8人
F1两者的调和平均值
ROC和AUC
threshold 的调整,不是随便调的,设的越高,灵敏度就越低,设的越低,假阳性就越多。希望 TPR 越大越好而 FPR 越小越好
ROC (Receiver Operating Characteristic)曲线下面的面积越大,模型就越好。
这个曲线下面积就称为 AUC(Area Under the Curve),AUC取值一般在0.5-1之间,AUC越大,分类器越可能把真正的正样本排在前面,分类性能越好。
ROC曲线的特点:vs PRC
当正负样本的分布发生变化时,形状能够基本保持不变。P-R曲线形状会剧烈变化。
相对来讲ROC曲线会稳定很多,在正负样本量都足够的情况下,ROC曲线足够反映模型的判断能力。
因此,对于同一模型,PRC和ROC曲线都可以说明一定的问题,而且二者有一定的相关性,如果想评测模型效果,也可以把两条曲线都画出来综合评价。
Tensorflow四种交叉熵函数计算公式:tf.nn.cross_entropy
TensorFlow交叉熵函数(cross_entropy)·理解 - 简书
tensorflow交叉熵计算函数输入中的logits都不是softmax或sigmoid的输出,而是softmax或sigmoid函数的输入,因为它在函数内部进行sigmoid或softmax操作
def calculate_loss(self, predict, target):
"""
predict是未经过sigmoid的值
"""
loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=target, logits=predict))
return loss
cross_entropy = -tf.reduce_sum(tf.nn.softmax_cross_entropy_with_logits(labels=label, logits=y))
最小化交叉熵损失函数的过程也是最大化正确类别的预测概率的过程
softmax_cross_entropy_with_logits
计算方式:对输入的logits先通过softmax函数计算,再计算它们的交叉熵,但是它对交叉熵的计算方式进行了优化,使得结果不至于溢出。
output不是一个数,而是一个batch中每个样本的loss,所以一般配合tf.reduce_mean(loss)使用。
def softmax(x):
return (np.exp(x).T / np.exp(x).sum(axis=-1))
交叉熵和softmax区别
在实际操作中,会在神经网络的最后一层再加一个softmax层,很多论文里都会将softmax loss写成以下形式: n为batch size,C为类的数目,xi为第i个样本的特征,yi为xi对应的类标签,Wj和bj为类j的权重及偏置。
softmax loss简单来说,就是将神经网络的logit用softmax包裹起来,再丢到交叉熵里面去。看到很多人说什么softmax loss是不严谨的说法。实际上,我看了很多顶会论文,大佬们都是用softmax loss作为softmax function+cross entropy loss的简称。
总结一下,softmax是激活函数,交叉熵是损失函数,softmax loss是使用了softmax funciton的交叉熵损失。
batchNormalization与layerNormalization的区别 - 知乎
作用:
LayerNorm和BatchNorm的区别:主要是做规范化的维度不同
batchNormalization与layerNormalization的区别 - 知乎
①Batch Normalization(纵向规范化)M是mini-batch 的大小。比较适用的场景是:每个 mini-batch 比较大,数据分布比较接近。在进行训练之前,要做好充分的 shuffle. 否则效果会差很多。
②Layer Normalization(横向规范化) LN 针对单个训练样本进行,不依赖于其他数据,因此可以避免 BN 中受 mini-batch 数据分布影响的问题,可以用于 小mini-batch场景、动态网络场景和 RNN,特别是NLP领域。此外,LN 不需要保存 mini-batch 的均值和方差,节省了额外的存储空间。
答案是:为了保证模型的表达能力不因为规范化而下降。我们可以看到
https://www.zhihu.com/search?type=content&q=batchnorm和layernorm
① 帖一个LayerNorm的实现
class BertLayerNorm(nn.Module):
def __init__(self, hidden_size, eps=1e-5):
super(BertLayerNorm, self).__init__()
self.weight = nn.Parameter(torch.ones(hidden_size))
self.bias = nn.Parameter(torch.zeros(hidden_size))
self.variance_epsilon = eps
def forward(self, x):
u = x.mean(-1, keepdim=True)
s = (x - u).pow(2).mean(-1, keepdim=True)
x = (x - u) / torch.sqrt(s + self.variance_epsilon)
return self.weight * x + self.bias
② 帖一个BatchNorm的实现
self.batch_norm_is_training = tf.placeholder(tf.bool, name='batch_norm_is_training')
# conv1
conv1 = tf.nn.conv2d(self.input_x_expanded, W1, strides=[1, 5, 5, 1], padding="SAME", name="conv1")
conv1 = tf.contrib.layers.batch_norm(conv1, is_training=self.batch_norm_is_training, scope='bn1') # BN归一化
relu1 = tf.nn.relu(tf.nn.bias_add(conv1, b1), name="relu1")
def batch_norm(self, x, n_out, phase_train, batch_norm_decay, scope='bn'):
"""
Batch normalization on convolutional maps.
"""
with tf.variable_scope(scope):
beta = tf.Variable(tf.constant(0.0, shape=[n_out]),
name='beta', trainable=True)
gamma = tf.Variable(tf.constant(1.0, shape=[n_out]),
name='gamma', trainable=True)
# 计算x的均值和方差
batch_mean, batch_var = tf.nn.moments(x, [0,1,2], name='moments')
# 采用滑动平均的方法更新参数。函数初始化需要衰减速率(decay),用于控制模型的更新速度
ema = tf.train.ExponentialMovingAverage(decay=batch_norm_decay, name='ema')
def mean_var_with_update():
ema_apply_op = ema.apply([batch_mean, batch_var])
with tf.control_dependencies([ema_apply_op]):
return tf.identity(batch_mean), tf.identity(batch_var)
mean, var = tf.cond(phase_train,
mean_var_with_update,
lambda: (ema.average(batch_mean), ema.average(batch_var)))
normed = tf.nn.batch_normalization(x, mean, var,
beta, gamma, 1e-3, name = 'normed') # variance_epsilon是为了避免分母为0,添加的一个极小值1e-3
return normed
内部协变量偏移,给神经网络训练带来的问题:
新的解决方法 BN(百面深度学习)
集合啦,NLP数据增强技术!超全资源汇总 - 知乎
CV领域的标配,比如对图像的旋转、镜像、高斯白噪声等。
(1)文本替代
文本替代主要是针对在不改变句子含义的情况下,替换文本中的单词,比如,同义词替换、词嵌入替换等等。
同义词替换:在文本中随机抽取一个单词,然后再同义词库里将其替换为同义词。比如,使用WordNet数据库,将「awesome」替换为「amazing」。
词嵌入替换:采取已经预训练好的单词嵌入,如Word2Vec、GloVe、FastText、Sent2Vec等,并将嵌入空间中最近的邻接词作为句子中某些单词的替换。awesome替换成临近的amazing、prefect、fantastic
掩码语言模型(MLM)
类似于BERT、ROBERTA、ALBERT,Transformer模型已经在大量的文本训练过,使用掩码语言模型的前置任务。
在这个任务中,模型必须依照上下文来预测掩码的单词。此外,还可以利用这一点,对文本进行扩容。
基于TF-IDF的单词替换:基本思路在于TF-IDF得分低的单词是没有信息量的的词,因此可以替换,而不影响句子的原本含义。(This -> A)
(2)回译
就是先将句子翻译成另一种语言,比如,英语翻译成法语。然后再翻译回原来的语言,也就是将法语翻译回英语。检查两个句子之间的不同之处,由此将新的句子作为增强文本。
(3)随机噪声注入
在文本中注入噪声,来训练模型对扰动的鲁棒性。拼写错误、句子与句子交换顺序等
(4)生成方法
此工作尝试在保留标签类别的同时生成其他训练数据。 将类别标签附加到训练数据中的每个文本。 在修改后的训练数据上微调一个大型的预训练语言模型(BERT / GPT2 / BART)。对于GPT2,微调任务是生成,而对于BERT,目标将是屏蔽token预测。
使用微调的语言模型,可以通过使用类标签和少量的初始单词作为模型提示来生成新样本。本文使用每个训练文本的3个初始单词,并为训练数据中的每个点生成一个综合示例。
自然语言处理中数据增强(Data Augmentation)技术最全盘点
解决思想 如何解决NLP分类任务的11个关键问题:类别不平衡&低耗时计算&小样本&鲁棒性&测试检验&长文本分类 - 知乎
不平衡问题不仅仅是分类标签下样本数量的不平衡,其本质上更是难易样本的不平衡:即使样本数量是平衡的,有的hard example还是很难学习。
(1)重采样(re-sampling)
(2)重加权(re-weighting)
重加权就是改变分类loss。相较于重采样,重加权loss更加灵活和方便。其常用方法有:
TensorFlow/Keras的一个解决数据不平衡问题的机制
分类数据集极度不平衡(99.82%负样本 vs 0.18%正样本)。
统计每种类别包含的样本数量,并基于此计算类别权重。
# 计算每种类别数据的数量
counts = np.bincount(train_targets[:, 0])
# 基于数量计算类别权重
weight_for_0 = 1. / counts[0]
weight_for_1 = 1. / counts[1]
class_weight = {0: weight_for_0, 1: weight_for_1}
在训练时,加上一行代码设置类别权重即可。
model.fit(train_features, train_targets,
batch_size=2048,
epochs=50,
verbose=2,
callbacks=callbacks,
validation_data=(val_features, val_targets),
# 设置类别权重
class_weight=class_weight)
一行TensorFlow/Keras代码解决真实场景中数据不平衡(imbalanced)问题
(3)Focal Loss
(精:代码+CE缺点) Focal Loss --- 从直觉到实现 - 知乎
引入两个额外的变量来区分对待每个样本,以复习考试知识点为例子
【分科复习/类别权重】:每个【科目】的难度是不同的; 你要花 30%的精力在简单科目,70%的精力在困难科目。
【刷题战术/难度权重】:每道【题目】的难度是不同的; 你要根据以往刷类似题时候的正确率来合理分配精力。
拓:苏神(含FL多分类形式) 从loss的硬截断、软化到focal loss - 科学空间|Scientific Spaces
降低过拟合程度:
L1正则化和L2正则化:
L1(模型参数服从零均值拉普拉斯分布)和L2(模型参数服从零均值正态分布)
L1正则化与L2正则化 - 知乎
机器学习中用来防止过拟合的方法有哪些? - 知乎
温故知新——激活函数及其各自的优缺点 - 知乎
所有的标准深度学习神经网络结构如全连接多层感知机都很容易过拟合:当网络在训练集上表现越来越好,错误率越来越低的时候,实际上在某一刻,它在测试集的表现已经开始变差。
在 FastText 中使用 early_stopping :
monitor: 需要监视的量,val_acc() (模型准确率model accuracy)
patience: 当early stop被激活(如发现 loss 相比上一个 epoch 训练没有下降),则经过 patience 个 epoch 后停止训练
verbose: 信息展示模式
mode: ‘auto’,‘min’,'max’之一,在min模式训练,如果检测值停止下降则终止训练。在max模式下,当检测值不再上升的时候则停止训练。
[nlp] 深度学习技巧(防止过拟合)——Early Stopping 早停法_跳墙网