Function Set
不同的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,aucfrom 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