Blog of YouSiki

High school student from China, trying to enter PekingUniversity.

【人工智能实践】用Tensorflow搭建神经网络

用Tensorflow搭建简单的神经网路(NN)之前需要先了解一点Tensorflow的知识。

基本步骤

  1. 用张量(Tensor)表示数据
  2. 用计算图(Graph)构建网络
  3. 用会话(Session)执行计算图并训练网络

Tensorflow的基本知识

张量

我对张量的理解就是——任意维度的数组(好像Python里叫做列表)。

可以是1 x 1的数组,也就是一个单独的数,叫做标量。

可以是1 x N的数组,就是一个一维数组,也就是向量。

可以是N x N的数组,那就是一个二维数组,此时就是矩阵了。

可以是N x N x N的数组,我也不知道该叫什么了。

可以用阶数来描述它,比如标量是0阶的,向量是1阶的,矩阵是2阶的。

数据类型

Tensorflow里,数据类型有tf.int32tf.float32等。

计算图

“搭建神经网络的计算过程,是承载一个或多个计算节点的一张图,只搭建网络,不运算。”

计算图用来描述各个变量之间的关系,表示出每个张量的计算方式,比如c = a + b

会话

构建完计算图之后,Tensorflow只是知道每个张量应如何计算,但并不会计算出张量的值。而在会话中,我们可以让Tensorflow计算出某个张量的值。


我们现在可以编写一个简单的Tensorflow程序,用来实践上面学到的内容。

# coding=utf-8

import tensorflow as tf

# add 两个1x2的向量相加

a = tf.constant([1.0, 2.0])
b = tf.constant([3.0, 4.0])
c = a + b

# mul 一个1x2的矩阵和一个2x1的矩阵相乘

x = tf.constant([[1.0, 2.0]])
y = tf.constant([[1.0], [2.0]])
z = tf.matmul(x, y)

# 此时只构建了计算图,并没有真的计算出c和z的值
# 如果输出c和z,只能知道它们的类型

print('c:', c) # c应当是一个1x2的向量
print('z:', z) # z应当是一个1x1的标量

# 如果想计算出c和z的值,就需要用到对话

with tf.Session() as sess:
    print('c:', sess.run(c))
    print('z:', sess.run(z))

上面这段代码的输出是

c: Tensor("add:0", shape=(2,), dtype=float32)
z: Tensor("MatMul:0", shape=(1, 1), dtype=float32)
c: [4. 6.]
z: [[5.]]

Tensorflow中常用的函数

函数 用处
tf.constant 直接按照给定的参数(数组)生成常量)
tf.Variable 按照给定的参数生成变量
tf.random_normal 生成正态分布随机数
tf.truncated_normal 生成去掉过大偏离点的正态分布随机数
tf.random_uniform 生成均匀分布随机数
tf.zeros 生成全0数组
tf.ones 生成全1数组
tf.fill 生成全为指定值的数组

举一些例子具体说明。

w = tf.Variable(tf.random_normal([2,3], stddev = 2, mean = 0, seed = 1)) 生成正态分布的随机数,是一个2x3的矩阵,标准差为2,均值为0,随机种子为1。若不加随机种子,每次的数据将不一样。后三个参数可以省略。

w = tf.Variable(tf.truncated_normal([2,3], stddev = 2, mean = 0, seed = 1)) 生成去掉偏离过大的数据后的正态分布随机数。如果随机出来的数据偏离平均值超过两个标准差,这个数据将重新生成。

w = random_uniform(shape = 7, minval = 0, maxval = 1, dtype = tf.int32, seed = 1) 表示从一个均匀分布[minval maxval)中随机采样。注意定义域是左闭右开,即包含minval,不包含maxval。

w = tf.zeros([3,2], int32) 生成的是[[0,0],[0,0],[0,0]]

神经网络的实现过程

  1. 准备数据集,提取特征,作为输入喂给神经网络(Neural Network,即NN)
  2. 搭建 NN 结构,从输入到输出,先搭建计算图,再用会话执行( NN 前向传播算法 -> 计算输出)
  3. 大量特征数据喂给 NN,迭代优化 NN 参数 ( NN 反向传播算法 -> 优化参数训练模型)
  4. 使用训练好的模型预测和分类

前向传播和反向传播

前向传播就是搭建模型的计算过程,让模型具有推理能力,可以针对一组输入给出相应的输出。

反向传播就是训练模型参数,在所有参数上用梯度下降,使 NN 模型在训练数据上的损失函数最小。

反向传播训练方法有梯度下降、momentum 优化器、adam 优化器等。

train_step = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss)
train_step = tf.train.MomentumOptimizer(learning_rate, momentum).minimize(loss)
train_step = tf.train.AdamOptimizer(learning_rate).minimize(loss)

learning_rate是学习率,决定每次参数更新的幅度。过大可能无法收敛,过小训练速度太慢。一般可以取0.01之类的数。

然后大概就可以照葫芦画瓢了——

比如用一个单隐藏层的神经网络来学习一下3x+4y这个函数。

import numpy as np
import tensorflow as tf

BATCH_SIZE = 256
TRAIN_STEPS = 2048
DATA_SIZE = 4096

X = np.random.randn(DATA_SIZE, 2)
Y = [[3.0 * a + 4.0 * b] for (a, b) in X]

x = tf.placeholder(tf.float32, shape = (None, 2))
y = tf.placeholder(tf.float32, shape = (None, 1))

w1 = tf.Variable(tf.random_normal([2, 8]))
w2 = tf.Variable(tf.random_normal([8, 1]))

h = tf.matmul(x, w1)
t = tf.matmul(h, w2)

init = tf.global_variables_initializer()
loss = tf.reduce_mean(tf.square(y - t))
step = tf.train.GradientDescentOptimizer(0.01).minimize(loss)

with tf.Session() as sess:
    sess.run(init)
    for i in range(TRAIN_STEPS):
        st = (i * BATCH_SIZE) % DATA_SIZE
        ed = st + BATCH_SIZE
        sess.run(step, feed_dict = {x : X[st:ed], y : Y[st:ed]})
        if i % 256 == 0:
            print("loss", sess.run(loss, feed_dict = {x : X, y : Y}))

运行一下可以看到最后的Loss函数还是很小的,效果不错。

【人工智能实践】人工智能概述

人工智能

机器模拟人的意识和思维

图灵测试

1950年图灵在《机器能思考吗》中提出图灵测试: 提问者和回答者隔开,提问者通过一些装置(如键盘)向机器随意提问。多次测试,如果有超过 30%的提问者认为回答问题 的是人而不是机器,那么这台机器就通过测试,具有了人工智能。

消费级人工智能产品

见到的一些虚拟助手,就属于人工智能。

  1. Google Assistant
  2. Microsoft Cortana
  3. Apple Siri

人工智能的领导人物

  1. Geoffrey Hinton,人工智能领域鼻祖,让神经网络得以应用。
  2. Yann LeCun,改进卷积神经网络算法,使其具有工程应用价值,CNN是视觉领域的优秀模型。
  3. Yoshua Bengio,推动循环神经网络的发展,使其得到工程应用,RNN解决了自然语言处理中的问题。

机器学习

机器学习是一种统计学方法,计算机利用已有数据得出某种模型,再利用此模型预测结果

机器学习的流程

f:id:YOUSIKI:20180325175049p:plain

简单模型举例:决策树

预测班车到达时间

每天早上七点半,班车从 A 地发往 B 地,到达 B 地的时间如何准确预测?

如果你第一次乘坐班车,你的预测通常不太准。一周之后,你大概能预测出班车8:00 左右到达 B 地;一个月之后,随着经验的增加,你还会知道,周一常堵车,会晚 10 分钟,下雨常堵车,会晚 20 分钟。

于是你画出了如下的一张树状图,如果是周一,还下了雨,班车会 8:30 到达;如果不是周一,也没有下雨,班车会 8:00 到达。

f:id:YOUSIKI:20180325175505p:plain

机器学习三要素:数据,算法,算力

深度学习

类比生物脑神经元,构建深层次神经网络

类比神经元,让一个结点接受一或多个输入,进行一定的计算后输出结构。一张神经网络由许多个“神经元”组成。

f:id:YOUSIKI:20180325175915p:plain

总结回顾

本讲讨论了三项——人工智能,机器学习,深度学习。

人工智能包含机器学习,而深度学习是机器学习的一种。

f:id:YOUSIKI:20180325180148p:plain

机器学习主要可以分为两类——预测、分类。

预测(貌似在一些课程中叫做“回归”),就是对连续数据进行预测。比如给定平面上的一些点,用一条直线去拟合,使得方差尽可能小。这其实就是高中数学中的线性回归问题(最小二乘法)。 简单的算法就类似于爬山,不过每次的改变量不再是简单地乘以一个常数alpha,而是根据当前位置的代价函数的导数大小确定。这样的好处就是总是朝着当前位置令代价函数下降最快的方向移动,不易越过局部最优点。 预测的模型也不一定是直线,也可以是许多复杂的函数。 而且数据也不一定是二维的,很可能是高维度的。

分类,对离散数据进行分类。例如通过对一些数据的学习,根据一些输入的特点,判断当前病人的肿瘤是良性还是恶性。

助教笔记中的小结部分——

  1. 机器学习,就是在任务 T 上,随经验 E 的增加,效果 P 随之增加。
  2. 机器学习的过程是通过大量数据的输入,生成一个模型,再利用这个生成的模型,实现对结果的预测。
  3. 庞大的神经网络是基于神经元结构的,是输入乘以权重,再求和,再过非线性函数的过程。