李宏毅机器学习课程5~~~分类:逻辑回归
2017-07-30 08:42
477 查看
Function Set
Finding the best Function
对于deep learning,我们是在一个非常高维的世界里做梯度下降。这时的 local minimum 很难形成,因为局部最小值要求函数在所有维度上都是局部最小。更实际得情况是,函数会落到一个saddle-point上,如下图
在saddle-point上会有一大片很平坦的平原,让梯度几乎为0,导致无法继续下降。反倒是local/global minimum的问题,大家发现其实不同的local minimum其实差不多(反正都是over-fitting training data),一般难找到local minimum,找到的一般是saddle point.
对于saddle point, 可以使用momentum技术。
多层神经网络,大部分局部极小值都在底部 ,已经非常接近全局最小值,可参考上图。训练到底的全局最小值往往意味着过拟合 ,找到全局最小也许反而是件坏事。
•(Pascanu,Dauphin, Ganguli,Bengio,arXiv May 2014): On the saddle point problem for non-convex optimization
•(Dauphin,Pascanu,Gulcehre,Cho,Ganguli,Bengio,NIPS’2014):
identifying and attacking the saddle point problem in high-dimensional non-convex optimization
《Qualitatively characterizing neural network optimization problems》这篇也简单的论证了sgd中local minimum并不是大问题
Discriminative VS Generative
理论推导见Bishop, P209-210
逻辑回归的局限性
深层学习为何要“Deep”(上)
Python_sklearn机器学习库学习笔记(三)logistic regression(逻辑回归)
参考文献
http://speech.ee.ntu.edu.tw/~tlkagk/courses_ML17.html
不同的w,b来确定不同的函数,这样就组成了函数集合,不同的w,b可以来表达不同的分布函数。
Good of a Function变换表达形式
两个Bernoulli distribution的交叉熵。所谓交叉熵,是用来刻画两个分布的相似性。在这里,交叉熵可以理解为真实分布与预测分布的相似度。同分布的话,交叉熵是0
Finding the best Function
上式表明预测值与真实值差距越大,则梯度下降时更新就越大。
逻辑回归+均方误差离目标很近,微分为0,离目标很远时,微分也为0.
距离目标很远时,交叉熵的微分值会比较大,可以更快更大的更新参数。而均方误差,在距离目标很远时,有时候微分值会比较小,这样更新参数就会比较慢。当微分值比较小,设置较大的学习速率时,因为不能确定到底是距离目标值较远,还是较近(距离目标值较远,和较近,都有能可能微分值比较小),这也会产生矛盾。若是微分值比较小,距离目标较近,设置比较大的学习速率,会很快略过局部极值点。正常情况下,距离目标较近时,应该设置较小的学习速率,距离目标较远时,应该设置较大的学习速率。
Deep Learning会陷入局部最优解的问题
本部分内容转自:https://www.zhihu.com/question/38549801对于deep learning,我们是在一个非常高维的世界里做梯度下降。这时的 local minimum 很难形成,因为局部最小值要求函数在所有维度上都是局部最小。更实际得情况是,函数会落到一个saddle-point上,如下图
在saddle-point上会有一大片很平坦的平原,让梯度几乎为0,导致无法继续下降。反倒是local/global minimum的问题,大家发现其实不同的local minimum其实差不多(反正都是over-fitting training data),一般难找到local minimum,找到的一般是saddle point.
对于saddle point, 可以使用momentum技术。
多层神经网络,大部分局部极小值都在底部 ,已经非常接近全局最小值,可参考上图。训练到底的全局最小值往往意味着过拟合 ,找到全局最小也许反而是件坏事。
•(Pascanu,Dauphin, Ganguli,Bengio,arXiv May 2014): On the saddle point problem for non-convex optimization
•(Dauphin,Pascanu,Gulcehre,Cho,Ganguli,Bengio,NIPS’2014):
identifying and attacking the saddle point problem in high-dimensional non-convex optimization
《Qualitatively characterizing neural network optimization problems》这篇也简单的论证了sgd中local minimum并不是大问题
Discriminative VS Generative
判别模型仅仅是根据已经有的数据来去判断结果。而生成模型是可以根据已经有的数据来脑补数据来判别结果。如果采集的数据不够充分,那么判别模型的能力就会减弱。
生成模型在数据量较小,数据有噪声时,有时候会比判别模型有优势。
多分类理论推导见Bishop, P209-210
逻辑回归的局限性
特征变换是一种思路
可视化空间变换demo线性可分视角:神经网络的学习就是学习如何利用矩阵的线性变换加激活函数的非线性变换,将原始输入空间投向线性可分/稀疏的空间去分类/回归。 增加节点数:增加维度,即增加线性转换能力。 增加层数:增加激活函数的次数,即增加非线性转换次数。
深层学习为何要“Deep”(上)
深度学习的每层都可以认为是一种特征变换,逐层生成不同的特征,进而达到更好的分类效果。
示例垃圾邮件分类
SMSSpamCollection下载import pandas as pd df=pd.read_csv('SMSSpamCollection',delimiter='\t',header=None) df.head()
from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.linear_model.logistic import LogisticRegression from sklearn.cross_validation import train_test_split #用pandas加载数据.csv文件,然后用train_test_split分成训练集(75%)和测试集(25%): X_train_raw, X_test_raw, y_train, y_test = train_test_split(df[1],df[0]) #我们建一个TfidfVectorizer实例来计算TF-IDF权重: vectorizer=TfidfVectorizer() X_train=vectorizer.fit_transform(X_train_raw) X_test=vectorizer.transform(X_test_raw) #LogisticRegression同样实现了fit()和predict()方法 classifier=LogisticRegression() classifier.fit(X_train,y_train) predictions=classifier.predict(X_test) for i ,prediction in enumerate(predictions[-5:]): print '预测类型:%s.信息:%s' %(prediction,X_test_raw.iloc[i])
from sklearn.linear_model import LogisticRegression from sklearn.metrics import accuracy_score eval_sklearnLogistic = True from sklearn.cross_validation import train_test_split,cross_val_score from sklearn.cross_validation import train_test_split,cross_val_score from sklearn.metrics import roc_curve,auc from sklearn.linear_model import LogisticRegression from sklearn.metrics import classification_report,accuracy_score,confusion_matrix print("Start evaluating softmax regression model by sklearn...") reg = LogisticRegression(solver="lbfgs", multi_class="multinomial") newsklearntrain_labels = [] for i in range(sklearntrain_labels.shape[0]): #print i #print(int(sklearntrain_labels[i][1])) newsklearntrain_labels.append(int(sklearntrain_labels[i][1])) #print(type(aa)) reg.fit(sklearntrain_features, np.array(newsklearntrain_labels)) ### 准确率 scores=cross_val_score(reg,sklearntrain_features,np.array(newsklearntrain_labels),cv=5) print("The accuracy of the train set", np.mean(scores), scores) ### 精确率和召回率 precisions=cross_val_score(reg,sklearntrain_features,np.array(newsklearntrain_labels),cv=5, scoring='precision') print("The precision of the train set", np.mean(precisions), precisions) recalls = cross_val_score(reg,sklearntrain_features,np.array(newsklearntrain_labels),cv=5, scoring='recall') print("The recall of the train set", np.mean(recalls), recalls) plt.scatter(recalls, precisions) ### 计算综合评价指标 fls=cross_val_score(reg,sklearntrain_features,np.array(newsklearntrain_labels),cv=5,scoring='f1') print("The f1 is:", np.mean(fls), fls) newvalid_labels = [] for i in range(valid_labels.shape[0]): #print i #print(int(sklearntrain_labels[i][1])) newvalid_labels.append(int(valid_labels[i][1])) #print(type(aa)) #np.savetxt('coef_softmax_sklearn.txt', reg.coef_, fmt='%.6f') # Save coefficients to a text file test_y_predict = reg.predict(valid_features) print("Accuracy of test set: %f" % accuracy_score(np.array(newvalid_labels), test_y_predict)) #用混淆矩阵可视化函数画图 #from cm_plot import * #导入混淆矩阵可视化函数 cm_plot(np.array(newvalid_labels), tree.predict(valid_features)).show() #显示混淆矩阵可视化结果如下 ### ROC AUC test_y_predict=reg.predict_proba(valid_features)#每一类的概率 false_positive_rate, recall, thresholds = roc_curve(np.array(newvalid_labels), test_y_predict[: , 1]) roc_auc=auc(false_positive_rate,recall) plt.title('Receiver Operating Characteristic') plt.plot(false_positive_rate, recall, 'b', label='AUC = %0.2f' % roc_auc) plt.legend(loc='lower right') plt.plot([0,1],[0,1],'r--') plt.xlim([0.0,1.0]) plt.ylim([0.0,1.0]) plt.ylabel('Recall') plt.xlabel('Fall-out') plt.show() print("The report is:",classification_report(np.array(newvalid_labels), test_y_predict))
详细参考
机器学习系列:(四)从线性回归到逻辑回归Python_sklearn机器学习库学习笔记(三)logistic regression(逻辑回归)
参考文献
http://speech.ee.ntu.edu.tw/~tlkagk/courses_ML17.html
相关文章推荐
- 李宏毅机器学习课程4~~~分类:概率生成模型
- 在opencv3中实现机器学习之:利用逻辑斯谛回归(logistic regression)分类
- Coursera吴恩达机器学习课程 总结笔记及作业代码——第3周逻辑回归
- 【原】Andrew Ng斯坦福机器学习 Coursera—Programming Exercise 3 逻辑回归多分类和神经网络
- 机器学习逻辑回归:使用C++语言手工编写程序对a1a数据集进行Logistic分类
- 机器学习-分类算法-逻辑回归
- 台湾大学林轩田和李宏毅机器学习课程
- 李宏毅机器学习课程10~~~卷积神经网络
- 李宏毅机器学习课程12~~~半监督学习
- 李宏毅机器学习课程笔记7:Transfer Learning、SVM、Structured Learning - Introduction
- 李宏毅机器学习课程笔记1:Regression、Error、Gradient Descent
- 斯坦福CS229机器学习课程笔记 part2:分类和逻辑回归 Classificatiion and logistic regression
- 监督学习之分类和逻辑回归
- 台大李宏毅2017机器学习国语课程(更新)
- [机器学习入门] 经典台大李宏毅机器学习课程从这里开始
- Ng深度学习笔记2 -逻辑回归、分类问题、牛顿迭代
- 机器学习:从编程的角度去理解逻辑回归
- 机器学习--线性回归、逻辑回归
- CS229学习笔记之分类问题与逻辑回归
- 深度学习入门实战(三)-图片分类中的逻辑回归