深度神经网络

  • 预训练(pre-training)的本质是参数(权值&&偏置)的初始化(careful initialization)。

  • 自动编码(autoencoder)的数学意义是寻找approximate identity function(g(x)=xg(x)=x)

    d⟶W1ijd~⟶W1jid

    d\stackrel{W_{ij}^1}{\longrightarrow}\tilde{d}\stackrel{W_{ji}^1}{\longrightarrow}d

判断学习的过程是否过慢

以神经网络、以梯度下降学习算法为例:
判断学习过程的变化情况,就是判断代价函数对模型所要学习的量,比如权重∂C∂wLjk\frac{\partial\,C}{\partial\,w_{jk}^L}的变化情况。

logistic regression

logistic regression是一个基于概率的(probabilistic ),线性分类器(classifier),注意逻辑斯特回归是一个分类模型,而不是回归模型。

tanh or sigmoid

用作激励函数的函数是选择tanh\tanh还是sigmoidsigmoid:

tanh(a)=ea−e−aea+e−asigmoid(a)=11+e−a

\tanh(a)=\frac{e^{a}-e^{-a}}{e^{a}+e^{-a}}\\ sigmoid(a)=\frac{1}{1+e^{-a}}

一般选择tanh\tanh,因为更容易产生更快的学习效率(it typically yields to faster training and sometimes also to better local minima)

SGD(stochastic gradient descent)

SGD=S+GD

\mathrm{SGD=S+GD}

SGD要点有二:

  • 随机

    S:Stochastic\mathrm{S:Stochastic}的实现——shuffle\mathrm{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)

反向传播算法(监督学习)接收每一笔(单笔单笔接收)输入((x,y)(x, y)),根据目前的weights以及biases进行对特征向量的预测(a=σ(w⋅a+b)a=\sigma(w\cdot a+b)),也即y_pred = feedforward(x),最终根据真实值与预测值之间的误差(cost_derivative=y_pred−y\mathrm{cost\_derivative=y\_pred-y})进行对权值及偏置的更新,这中间是一系列相对麻烦的过程,也是反向传播算法的精髓所在。也即,反向传播的最终目的是通过真实值与预测值的误差进行对权值以及偏置的更新。

w′k=wk−η⋅∑mj=1∂Cxj∂wkmb′l=bl−η⋅∑mj=1∂Cxj∂blm

w_k^{'}=w_k-\eta\cdot\frac{\sum_{j=1}^{m}\frac {\partial\, C_{x_j}}{\partial\, w_k}}{m}\\ b_l^{'}=b_l-\eta \cdot\frac{\sum_{j=1}^m\frac{\partial\,{C_{x_j}}}{\partial\, b_l}}{m}

以上的梯度下降(GD:GradientDescent\mathrm{GD:\,Gradient\,Descent})公式中的,∂Cxj∂wj\frac{\partial\,C_{x_j}}{\partial\,w_j}正是反向传播算法的工作。

∑mj=1∂Cxj∂wkm\frac{\sum_{j=1}^m\frac{\partial\, C_{x_j}}{\partial\,w_k}}{m}表达的是块的概念,将某一块当做一个整体进行权值以及偏置的更新,否则每传递进来一个样本都要进行一次前向进行预测,后向进行更新,会增大计算量。

面向对象版BP神经网络

神经网络的步骤:

  • 初始化全部权值和偏置

    这一步自然放在Network的构造函数的内部进行(一般的做法是使用np.random.randn())。因为初始化动作以及类的构造函数一样,只进行一次,也自然,Network类持有整个神经网络的全部权值以及偏置。

    class Network(object):def __init__(self, topology):self.topology = topologyself.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)W_{(j\times i)},jj表示后一层(layer)的神经元(neuron)个数,ii表示前一层(layer)的神经元(neuron)个数,这样做的目的是为了后面计算内积的方便,也即W(j×i)⋅x(i×1)W_{(j\times i)}\cdot x_{(i\times 1)},而前一层向后一层的偏置为b(j×1)b_{(j\times 1)},这样根据前向(forward)计算(称之为链式计算吧),可获得下一层的输入也即:W(j×i)⋅x(i×1)+b(j×1)W_{(j\times i)}\cdot x_{(i\times 1)}+b_{(j\times 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)(x, y),进行backpropagation\mathrm{back\,propagation},更新全部权值及偏置:

    1. 计算各层各个神经元的输入(zs\mathrm{zs})与输出(activations\mathrm{activations})

      sll=∑iWljixl−1ixlj=σ(slj)

      s_l^l=\sum_iW_{ji}^lx_i^{l-1}\\ x_j^l=\sigma(s_j^l)

    2. 根据(cost_derivative\mathrm{cost\_derivative}也即output_activation−y\mathrm{output\_activation - y})计算末尾一层的δ\delta
      ∂en∂sLi=(xLi−y)∂xLi∂sLi=(xLi−y)⋅σ′(sLi)∂en∂WLji=∂en∂sLi⋅∂sLi∂WLji=∂en∂sLixL−1i

      \frac {\partial e_n}{\partial s_i^L} = (x_i^L-y)\frac{\partial x_i^L}{\partial s_i^L}=(x_i^L-y)\cdot\sigma '(s_i^L)\\ \frac{\partial e_n}{\partial W_{ji}^L} = \frac {\partial e_n}{\partial s_i^L} \cdot \frac{\partial s_i^L}{\partial W_{ji}^L}= \frac {\partial e_n}{\partial s_i^L} x_i^{L-1}

    3. 后向计算每一层的权值更新
∂en∂Wlji=∂en∂sli⋅∂sli∂Wlji∂en∂sli=∑k

\frac{\partial e_n}{\partial W_{ji}^l} = \frac {\partial e_n}{\partial s_i^l} \cdot \frac{\partial s_i^l}{\partial W_{ji}^l}\\\frac {\partial e_n}{\partial s_i^l} =\sum_k

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 = xactivations = [x]zs = []# step 1for w, b in zip(self.weights, self.biases):z = np.dot(w, activation) + bzs.append(z)activation = sigmoid(z)activations.append(activation)# step 2delta = (activations[-1]-y)*sigmoid_prime(zs[-1])nabla_b[-1] = deltanabla_w[-1] = np.dot(delta, activations[-2].transpose())# 因为是两层之间的权值矩阵,delta表示的后一层的列# activations[-2]表示的前一层的列,作一转置# step 3for l  in range(2, self.num_layers):z = zs[-l]sp = sigmoid_prime(z)delta = np.dot(self.wights[-l+1].transpose(), delta)*spnabla_b[-l] = deltanabla_w[-l] = np.dot(delta, activations[-l-1].transpose())

sigmoid_prime是对sigmoid函数的导数:

def sigmoid_prime(z):return sigmoid(z)*(1-sigmoid(z))

机器学习算法mini版相关推荐

  1. 10种经典机器学习算法——Python版

    klearn python API LinearRegression from sklearn.linear_model import LinearRegression # 线性回归 # module ...

  2. 大疆2019校招提前批机器学习算法工程师在线笔试题目回忆版

    最后还涉及到两道16分的在线编程题目,但是我忘记了,故没有列出来,望大家原谅2333. 大疆2019年校招提前批机器学习算法工程师B卷题目回忆版 1 考察关于各种激活函数 sigmoid.tanh.r ...

  3. python 算法教程 pdf 英文_上手实践《Python机器学习第2版》PDF中文+PDF英文+代码+Sebastian...

    学习机器学习,推荐学习<Python机器学习(第二版)>. <Python机器学习(第2版)>,图文并茂,代码详实,原理清晰,覆盖面适度,侧重算法实现和应用,作为入门级学习还是 ...

  4. 机器学习算法之聚类算法拓展:Mini Batch K-Means算法

    言归正传,先介绍一下 Mini Batch K-Means算法 Mini Batch K-Means算法是K-Means算法的一种优化变种,采用小规模的数据子集(每次训 练使用的数据集是在训练算法的时 ...

  5. 机器学习算法大汇总--线性回归、逻辑回归、正则化、神经网络、SVM、K-Means、PCA、集成学习等!

    本文很长~请耐心观看 另:本文主要用于本人的复习使用,欢迎大佬的指正和添加. 还有:本人也只是初出茅庐,希望大佬手下留情,谢谢!! 1.算法分类 机器学习算法分为: 有监督,无监督 两大阵营 1.有监 ...

  6. 机器学习算法知识总结

    BAT机器学习面试系列 1.请简要介绍下SVM. SVM,全称是support vector machine,中文名叫支持向量机.SVM是一个面向数据的分类算法,它的目标是为确定一个分类超平面,从而将 ...

  7. AI一分钟 | 小米智能音箱mini版曝光,或售199元;特朗普被指利用AI竞选成功

    整理 | 阿司匹林 一分钟AI 3月19日,小米社区有网友曝光了小爱同学mini版,它可能是3月27日小米MIX 2S发布会的"小惊喜",售价可能为199元. 据外媒报道,剑桥分析 ...

  8. 有必要将所有机器学习算法都实现一遍吗?

    点击上方"Datawhale",选择"星标"公众号 第一时间获取价值内容 来源:知乎 整理:louwill 链接:https://www.zhihu.com/q ...

  9. 知乎讨论:有必要将所有机器学习算法都实现一遍吗?

    观点分享 来源:知乎 整理:louwill 链接:https://www.zhihu.com/question/36768514 作者:微调 https://www.zhihu.com/questio ...

最新文章

  1. leetcode-回文数(简单)
  2. mysql查询哪天,Mysql日期查询的详细介绍
  3. 基于GDI+用C#编写的.NET流程图控件开发周记(2011-08-28)
  4. 如何让博客变得稍稍好看
  5. 华为云.NET Core支持情况调查
  6. Oracle导入dmp文件报12504,ORA-12504:TNS :监听程序在 CONNECT_DATA 中未获得SERVICE_NAME...
  7. 怎么让Excel按某一列的数值来排序?
  8. MPAndroidChart绘制图形表
  9. golang语言函数--示例--模板--小程序模板
  10. 【车辆识别】基于matlab GUI小波和盒维数车型识别【含Matlab源码 727期】
  11. java layout各布局_java-Layout(布局管理器)
  12. php seek_cur,Golang中seek使用方法详解
  13. 数字图像处理与Python实现笔记之图像压缩
  14. linux网络不通检查方法
  15. 使用RT-Thread Studio DIY 迷你桌面时钟(二)| 获取温湿度传感器数据(I2C设备驱动+SHT3x软件包)
  16. html语言教程教案,HTML语言与网页制作教案.doc
  17. matlab eval函数用法
  18. 3D打印机远程挤出与近程挤出的优缺点
  19. Express模版引擎hbs备忘
  20. HTML 创建按钮实现跳转链接

热门文章

  1. CDH页面配置HA(高可用)
  2. Python 综合应用 —— 名片管理系统
  3. linux文件服务有哪些,linux有哪些文件系统?_网站服务器运行维护,linux
  4. java和php区别吗_请说说Java和PHP的区别
  5. redis源码剖析(5):基础数据结构inset
  6. 去掉CSDN blog 多余的版权申明部分[转贴]
  7. Mysql err 1055
  8. 练习:查找指定目录(包括子目录)下的视频(格式为.mp4,.rmvb,.avi),并将目录存放在一个文件中...
  9. 性能测试篇 :Jmeter HTTP代理服务器录制压力脚本
  10. 【leetcode刷题笔记】Roman to Integer