0%

相比sklearn 中已有的,可以直接调的评价指标来说,本文提及的指标会复杂一些.
指标的改进是为了针对特定的需求,使模型朝着希望的路径演变,本质上来说是一种加权,针对特定需求朝着特定方向的加权.本文参考的使用案例则是希望能够在分类的时候对身份识别能够有特定的加权,故特改进之.

详参
论文参考
使用案例

只是做一些学习记录,如有遗误,望请指教.

公式

$${score}=w_{0} A U C_{\text {overall}}+\sum_{a=1}^{A} w_{a} M_{p}\left(m_{s, a}\right)$$

最终得分由 整体AUC 与 广义偏差AUC均值 们 加权 得到.
本次涉及到3种偏差AUC(Subgroup_AUC/BPSN_AUC/BNSP_AUC).

整体AUC值是常规操作,详可参sklearn.

其中:

  • $A$表示子指标数量 本次为3
  • $m_{s, a}$表示子组s的第a中偏差指标
  • $w_{a}$ 表示对应的 广义均值 权重, 本次所有权重都为0.25,即等权.
  • $M_{p}\left(m_{s, a}\right)$ 含义

    即广义均值
    本次计算广义偏差AUC均值
    公式为:
    $$
    M_{p}\left(m_{s}\right)=\left(\frac{1}{N} \sum_{s=1}^{N} m_{s}^{p}\right)^{\frac{1}{p}}
    $$
    其中:
    • $M_{p}$表示p级广义均值, 本次取p=-5
    • $m_{s}$表示子组s的偏差指标
    • $N$ 表示子组数量

进一步, 公式的重点是定义了三种偏差AUC.

三种偏差AUC含义

三种偏差AUC的计算公式其实一样,都是计算AUC,不同的是基于不同的数据子集计算.

  • Subgroup_AUC

    基于 满足身份识别的样本所构成的子数据集计算的AUC,这个指标越低表示在特定需求(身份识别)上模型表现越差.

  • BPSN_AUC

    即 Background Positive, Subgroup Negative AUC
    基于提及身份的正面和不提及身份的负面样本所构成的子数据集计算的AUC,这个指标越低表示模型混淆了身份识别,只要提及了身份识别就可能被预测得到更高的值,这不是希望的最佳模型.

  • BNSP_AUC

    即 Background Negative, Subgroup Positive AUC
    基于提及身份的负面和不提及身份的正面样本所构成的子数据集计算的AUC.

结语

所以同理,
将来也可以基于此思路,针对其它的特定需求,设计特定的评价指标.在模型训练的时候就依据需求进行加权.

传统无监督聚类方法一般使用KMEANS及其变类,原理使用距离度量.

背景

希望可以对中文句子进行无监督聚类.
最简单的实现可以是利用word2vec求句子平均向量,然后建立KMEANS模型.
但是,显而易见,这个过程中使用平均使得信息的丢失是比较多的,特别是句子或者文章比较长的情况下,越长信息的丢失也就越多,必然导致模型的可用性下降.

另一种思路是使用NN来对句子\多个句子或者文章这种序列进行特征提取(而不是使用平均)–也就可以展到更高的维度空间去,然后使用使用KMEANS模型.
所以关键就是如何使用NN进行特征提取.

思路

  • 与传统的NLP任务相似,需要有一步补齐操作,如果在多个句子的词场景下,是不是可以在更高一个维度上进行补齐操作后就与传统NLP任务类似了呢?(高了一个维度)
  • 基于word2vec,和补齐\嵌入等操作,直接将高维空间展成二维向量,然后聚类,(这种思路有点将word2vec也视为预训练模型的感觉),也可以再降降维什么的
  • 采用迁移学习的思路,利用其它任务的得到的模型进行中间层输出得到特征

几个思路都可以一试.具体效果可能需要到不同的场景下结合数据进行验证.(对的,是”可能”,不然怎么讲是实验科学呢++)

实操

  • Autoencoder

    使用变分自动编码是一种操作,主要也是利用降维的思路.
    参考:
    Autoencoders
    Sparse autoencoder
    Autoencoders and Word embeddings
    Blog Post Clustering
    Variational Autoencoder base on pytorch

  • 针对NLP的自动编码

    图像领域一般可以用变分自动编码.
    那么sentence级别的是不是可以考虑用LSTM进行自编码呢?
    可谓之LSTM自动编码++
    经过实验表明:是可以的.

  • 针对句子无监督聚类的双路LSTM+Attention自动编码

    经过实验表明,效果很好很好
    我要把它称作: Unsupervised Clustering base on double LSTM&Attention
    思路就是使用上面提到的思路,当然具体过程需要有一些操作.结果表明效果很好,不仅可以捕获到内容,还可以捕获到结构,远远不是平均的效果可以匹敌的.哈哈哈哈,真棒.
    后面可能单独开一篇做一些介绍,先上线再说,哈哈……

效果

句子级别的聚类,特别是多句子(也可以扩展到篇章)的效果很好,当然会比平均复杂一点点,但是效果好太多.

结语

有了一个新的模型架构,
有点引入了无监督对抗的味道,
使用了数据本身做标签,不依赖结果标签,也就实现了无监督,哈哈,我真棒!

由于最近的工作有涉及到一些NLP的研究,而Bert的效果看起来不错,所以在原有方案上,基于相同的数据集(内部的任务数据集,所以暂时不会公开),做了一下效果对比.

只做一些简单的记录,以备自己将来回溯.

背景是基于中文句子分类.任务数据集在100万左右.

2080 on Pytorch.

原有方案

word2vec(200维度) + LSTM + Attention
网络结构比较简单,常规操作
训练 5 epoch大概需要10分钟左右.
准确率在77%左右.

Bert效果

中文预训练模型
训练 1 epoch大概需要200分钟.
准确率在76%左右.

Bert的一些备注

Bert有三个嵌入层,向量(Token)、上下部分(Segment)、位置(Position), 具体的一些解释可以参考
维度为768,所以比原来的高不少,这慢的一个原因(还有是因为网络结构比较复杂)
基于预训练模型在现有任务上训练一个epoch的效果最好,好像并不是训练的epoch越多越好,还不知道是为什么

其它

具体可以参考pytorch-pretrained-BERT,里面不止有Bert的预训练模型,还有一些其它模型的Pytorch实现,想要快速上手可以参考,特别是examples目录下的代码++

Bert是好,但并不一定在你的场景下也好,正式投产前还是需要做一些研究的.毕竟NLP这类的机器学习任务的数据集变化对模型的影响是很大的.

在Keras 中自定义可训练层

Bert预训练模型有12层或者24层,一般在起上层的Finetune任务会对所有层参数进行微调,也还有可能会在后面再接一些Layer.
但是,如果对所有层都进行微调的话,需要调整的参数量可能过大,12(约1.1亿), 24(2.2亿),耗时会比较久,如果只对后面几层或者特定层进行微调,可以是微调参数大大减少,训练实现也会加快.
主要可有参考:
Fine-tuning BERT with Keras and tf.Module
Finetuning BERT with Keras and tf.Module.ipynb
bert_experimental
TensorFlow Documentions
Keras Documentions

没卡是没法做深度学习的,所以决定斥资装一台服务器.

关于本文

本想边装边写指南,但是由于自己也是第一次装PC,还不定会成功呢,再者也不想写成流水账.所以在成功使用了一段时间之后以回忆录的方式记一下.
因为不是按装机步骤记录的指南,所以可能对装机也没什么参考价值.仅饭后小文而已.

前言

本来由于已经有一台MBP了,所以还考虑过的方案是给它配外接GPU,链接网站(egpu.io)是专门给MBP配eGPU的大神们分享经验的地方,如果有这个需求或许可以参考.
后来之所以放弃是因为:

  • MBP的CPU也不是很强(17款)
  • 内存也只有16G
  • 需要完全对接机器硬件、系统、GPU、电源等一些问题(会略复杂)
  • MBP是需要便携移动的,eGPU有点烦了
  • 干脆弄一台服务器,MBP来做数据探索、特征处理,服务器来跑代码,拓展性足够,两不耽搁(只是钱包略痛)

成本

成本来说的话,打算用于长期学习的话肯定自购硬件比较划算,毕竟随着时间的流逝,边际成本越来越低.
如果只是用个一时半会的肯定直接租用云平台了,在超出本地服务器要求时的短期需求也可以直接放在云平台上运行.

结果

过程虽有坎坷,结果还是OK的,但还有几个坑要提一下.
由于选了华硕x299主板,只能装win10(其实我想装Ubuntu啊++),系统原因又会导致一系列问题,比如NV、深度学习框架等等兼容性.在初学者的路上,任何一个小问题都可能使计划夭折在半路上,所以要慎重.主板的选择基本决定了系统,系统基本决定了平台和框架.所以要慎重.(选的时候注意主板和CPU/GPU的兼容基本就没啥问题了)
由于装的win10系统(在深度学习界并不是公认主流),导致TF-GPU安装一直报错失败,虽然参考官方文档进行了多次check,但依然没有解决,这就导致了keras基本处于不可用的状态.所幸Pytorch是可用的,不然我真是要洒泪了++,也就是现实将我逼上了Pytorch这座梁山.
装win系统还需要克制自己想装游戏的冲动,目前我还能克制.

过程

资料准备

资料来源主要参考了知乎上关于深度学习的装机指南帖子(https://www.zhihu.com/question/33996159?sort=created).

列配置

(此配置不具有参考性,请参考阅读时间当前的最新硬件及其兼容性[既然要装,这些也是逃不掉要学的,或早或晚,或交学费或没有])

  • 主板: WS X299
  • CPU: Inter i7 7820x
  • GPU: RTX 2080
  • 内存: 金士顿 16G*2
  • SSD: SAMSUNG
  • 水冷: 海盗船
  • 硬盘: WD 4T
  • 电源: CORSAIR
  • 显示器: PHILIPS 27
  • 机箱: AIR540
  • 鼠键: 罗技

Markdown

插线

设备买好之后,按照操作手册把线插好就行了.
当然,最复杂就是如何接主板上的接口,要多看两遍主板手册.
Markdown
(走线不是关键,走线再漂亮,点不亮也是白搭)

装系统

本以为,虽没装过操作系统,应该也能搞定.
殊不知,没搞定.
然后找了个专业装系统的,花了120,++.(没有启动盘).
Markdown
真是惭愧~

装软件

软件就比较简单了(但也不尽然,比如TF-GPU就没装好😢,道行还是不够啊).

写代码跑起来

测测GPU的安装成功与否.运行CUDA sample下的deviceQuery代码.
Markdown

后记

平台搭好,只是开始.
Markdown
后面的路还长.