机器学习算法mini版
来源:互联网 发布:会员返利系统源码 编辑:程序博客网 时间:2024/05/22 14:54
深度神经网络
预训练(pre-training)的本质是参数(权值&&偏置)的初始化(careful initialization)。
自动编码(autoencoder)的数学意义是寻找approximate identity function(
g(x)=x )d⟶W1ijd~⟶W1jid
判断学习的过程是否过慢
以神经网络、以梯度下降学习算法为例:
判断学习过程的变化情况,就是判断代价函数对模型所要学习的量,比如权重
logistic regression
logistic regression是一个基于概率的(probabilistic ),线性分类器(classifier),注意逻辑斯特回归是一个分类模型,而不是回归模型。
tanh or sigmoid
用作激励函数的函数是选择
一般选择
SGD(stochastic gradient descent)
SGD要点有二:
随机
S:Stochastic 的实现——shuffle :np.random.shuffle(training_data)
或者先随机地获得一次排列组合,再进行shuffle:
r = np.random.permutation(training_data.shape[0])training_data[r, :]
分块(batch)
mini_batches = [training_data[k:k+mini_batch_size] for k in range(0, n, mini_batch_size)]
back propagation
backprog(x, y)
反向传播算法(监督学习)接收每一笔(单笔单笔接收)输入(weights
以及biases
进行对特征向量的预测(y_pred = feedforward(x)
,最终根据真实值与预测值之间的误差(
以上的梯度下降(
面向对象版BP神经网络
神经网络的步骤:
初始化全部权值和偏置
这一步自然放在Network的构造函数的内部进行(一般的做法是使用
np.random.randn()
)。因为初始化动作以及类的构造函数一样,只进行一次,也自然,Network类持有整个神经网络的全部权值以及偏置。class Network(object): def __init__(self, topology): self.topology = topology self.num_layers = len(topology) self.biases = [np.random.randn((y, 1)) for y in topology[1:]] self.weights = [np.random.randn(y, x) for (x, y) in zip(topology[1:], topology[:-1])]
注意这里每两层权重矩阵的size,
W(j×i) ,j 表示后一层(layer)的神经元(neuron)个数,i 表示前一层(layer)的神经元(neuron)个数,这样做的目的是为了后面计算内积的方便,也即W(j×i)⋅x(i×1) ,而前一层向后一层的偏置为b(j×1) ,这样根据前向(forward)计算(称之为链式计算吧),可获得下一层的输入也即:W(j×i)⋅x(i×1)+b(j×1) 根据输入(单样本,但特征向量),前向计算获得样本的预测类别
def feedword(self, a): for w, b in zip(self.weights, self.biases): a = sigmoid(np.dot(w, a)+b) return a
遍历训练集,对每一个
(x,y) ,进行backpropagation ,更新全部权值及偏置:- 计算各层各个神经元的输入(
zs )与输出(activations )sll=∑iWljixl−1ixlj=σ(slj) - 根据(
cost_derivative 也即output_activation−y )计算末尾一层的δ ∂en∂sLi=(xLi−y)∂xLi∂sLi=(xLi−y)⋅σ′(sLi)∂en∂WLji=∂en∂sLi⋅∂sLi∂WLji=∂en∂sLixL−1i - 后向计算每一层的权值更新
- 计算各层各个神经元的输入(
def backprog(self, x, y): nabla_b = [np.zeros(b.shape) for b in self.biases] nabla_w = [np.zeros(w.shape) for w in self.weights] activation = x activations = [x] zs = [] # step 1 for w, b in zip(self.weights, self.biases): z = np.dot(w, activation) + b zs.append(z) activation = sigmoid(z) activations.append(activation) # step 2 delta = (activations[-1]-y)*sigmoid_prime(zs[-1]) nabla_b[-1] = delta nabla_w[-1] = np.dot(delta, activations[-2].transpose()) # 因为是两层之间的权值矩阵,delta表示的后一层的列 # activations[-2]表示的前一层的列,作一转置 # step 3 for l in range(2, self.num_layers): z = zs[-l] sp = sigmoid_prime(z) delta = np.dot(self.wights[-l+1].transpose(), delta)*sp nabla_b[-l] = delta nabla_w[-l] = np.dot(delta, activations[-l-1].transpose())
sigmoid_prime
是对sigmoid
函数的导数:
def sigmoid_prime(z): return sigmoid(z)*(1-sigmoid(z))
- 机器学习算法mini版
- 神经网络算法学习---mini-batch
- 神经网络算法学习---mini-batch
- 机器学习算法(精简版)
- 大规模机器学习:SGD,mini-batch和MapReduce
- 大规模机器学习:SGD,mini-batch和MapReduce
- 深度学习(batch,mini-batch,其它算法)
- 机器学习算法排名
- 《机器学习》 KNN算法
- 机器学习中的算法
- 机器学习算法
- 机器学习算法
- 机器学习算法
- 机器学习算法---决策树
- 机器学习_adaboost 算法
- 机器学习常用算法
- 机器学习算法_Adaboost
- 【机器学习】HMM算法
- NSString(拓展)
- Java中获得线程的返回值
- Linux内核代码风格
- 代码整洁之道
- SDUT 3362-数据结构实验之图论六:村村通公路(最小生成树_prim)
- 机器学习算法mini版
- js 运算误差解决方案
- java Timer的使用
- AJAX异步更改数据库
- Mysql 错误:2049的解决
- 中文分词之HMM模型详解
- mysql使用MRG_MyISAM(MERGE)实现水平分表
- [hdu 5316] Magician
- NSDate(拓展)