进入新的内容,深度学习啦
万事万物的产生不是一下子就变出来的,学术上也是,一点点的进步才催生出一门新的学科或者技术,神经网络用于机器学习也不例外,
前面的机器学习的内容,线性回归,逻辑回归,多分类,决策树,以及各种集成学习,再到概率图等等,其实隐约有了深度学习的影子,
只不过是只有一层输入一层输出的浅层神经网络,下面正式进入神经网络!
1. 神经网络算法是有监督的学习算法,
一个神经元 有很多树突dentrities(接收信号输入) 细胞体body经过分析综合汇总(激活函数) 通过轴突axon传递很长的距离,作为下一个神经元的输入 输出信号。
生物神经网络与人工神经元
- 激活函数:将神经元的净输入信号转换成单一的输出信号,以便进一步在网络中传播。(隐藏层如果没有进行非线性变换,那无非就是信号的放大与缩小,只是做“透传”,不进行汇总 分析 综合,神经元的意义何在) 隐藏层激活函数必须是非线性的
- 网络拓扑:描述了模型中神经元的数量以及层数和它们连接的方式。
- 训练算法:指定如何设置连接权重,以便抑制或增加神经元在输入信号中的比重。
常见的激活函数: (本质上是为了进行非线性的变换 如果都是线性变换 那一层就能搞定 要其他的层干嘛, 这也就是与之前的线性回归的本质区别)
-
sigmoid
输出正例的概率 隐射到 0-1之间
-
tanh
hyperbolic tangent
隐射到 -1--1 之间
-
relu
只有信号强到一定的程度才会输出
2. 分类
例如三分类 用ovr的方式训练三个二分类 逻辑回归
使用softmax变换
3. 训练
一次迭代:
前向传播计算一次输出loss
根据loss 以及梯度 更新w
这样来回一次 完成一次迭代
4. 代码
from sklearn.neural_network import MLPRegressor
from sklearn.neural_network import MLPClassifier
X = [[0, 0],
[1, 2]]
y = [0,
1]
clf = MLPClassifier(solver="sgd", alpha=0.00001, activation="relu", hidden_layer_sizes=(5, 2), max_iter=2000,
tol=0.00001)
clf.fit(X, y)
predict_value = clf.predict([[2, 2], [-1, -2]])
print(predict_value)
predict_prob = clf.predict_proba([[2, 2], [-1, -2]])
print(predict_prob)
print([coef.shape for coef in clf.coefs_])
print([coef for coef in clf.coefs_])