前段时间差不多花了半个多月时间来完成了一个无监督机器学习,实现语音Oneclass分类,即只有正类语音的训练样本,训练后的模型可能识别到非正类(负类)的语音。在使用传统机器学习oneclassSVM实现这个需求,但是在使用深度学习神经网络自动编码器时发现无法重建正类的训练样本,然后尝试挑战了神经网络的超参数后仍然无效,碍于电脑配置太弱,搁置了几天来理一下问题所在。今天晚上饭后溜娃时,突然发现了疑似线索,原来是神经网络自动编码器encoder的最底层的神经元数量太多,导致没有学习到单类语音的模式!
真是恍然大悟。那么关于编码器中间的神经元数量问题,在以前笔者的学习中,室使用fashion-minst数据来完成实践,因为最后的图形分类是10个,所以之中间神经元数量是10。那么对应笔者的需求,中间神经元理论数量应该是1,可能从业务层面上来说单类也存在多样性,最终不一定是1。是笔者的思维错误问题,最开始一直在调整隐藏层数量和神经元数量,但是都没有将中间神经元调低到很低,那么神经网络就没法学习到单类语音的说话模式,无法重建。
由于愚钝,笔者花了一周才在想通这个问题,真的是有种“悠然见南山”的感觉。回过神来,修改神经网络模型,将中间层神经元设为6个,发现重建语音的幅度有一点神似,但是听起来仍然是杂音,没有一丝原语音的信息。算了,先这样吧,笔者在oneclassSVM实践的每一步都保存了jupyter notebook,将传统的机器许学习oneclassSVM中遇到的问题做个总结。
1、MFCCs特征选择问题。
传统机器学习需要每次输入的长度固定,需要固定输入维度。语音识别会用对齐来解决长度不一致,而声纹、情感等分类问题,都是把帧数放在一起算平均。python_speech_features、pyAudioAnalysis、librosa都可以提取MFCCs特征,但是特征个数默认都是不一样的,都可以定制,那么应该选择几个特征呢?在笔者的语音中,使用箱线图来绘制20个默认特征的分布情况,箱线图可以显示一组数据分散情况资料的统计图,最大的优点就是不受异常值的影响。那么既然是单类语音,MFCC特征就不应该波动太大,不应该有异常值,下面的17-20的特征明显存在较多异常值,在送入模型时应该只选择前面16个较好。
通过特征主成分分析法PCA来降维可视化,前者时20个特征的图形,后者就是16个特征的图形。后者较为集中,可以通过标准差和方差能表示数据整体的波动,反映组内个体间的离散程度。后者的标准差和方差较小。
2、 oneclassSVM怎么部署判断正负类
onclassSVM可以直接输出1或者-1来判断正负类,但基于业务特性,可以 可以通过score_samples来动态选择阈值判断。model.score_samples得到决策分数,model.offset_得到决策边界分数,可以通过与 score_samples动态来选择。
3、怎么从多个 oneclassSVM模型中选择最好的一个
通过计算距离超平面的距离均值的的百分比来判断无监督模型的优劣。
np.mean(decision_scores) / oneclassSVM_model.offset_[0]
详细的探索过程,待笔者总结为论文,然后使用自动编码器(循环自动编码器)来做进一步的探索实践。
网友评论