【NLP】神经网络基础

文章目录

1. 前馈神经网络、网络层数、输入层、隐藏层、输出层、隐藏单元、激活函数的概念。

1.1 前馈神经网络(feedforward neural network)

ff
如图, 前馈神经网络(feedforward neural network)是种比较简单的神经网络,只有输入层input layer (黄)、隐藏层hidden layer (绿)、输出层output layer (红)

1.2 激活函数(Activation Function)

cell
如上图,神经网络神经元中,上层节点的输入值从通过加权求和后,到输出下层节点之前,还被作用了一个函数,这个函数就是激活函数(activation function),作用是提供网络的非线性建模能力。

更直观的图:
nn

每一个神经元如同工厂的流水车间的机器,它重复做着四件事情:【接受上一层数据作为输入>>线性变换>>激活变换>>输出数据到下一层】,每个神经元中有三个组成部分:权重(weight)矩阵W,偏置(bias)向量b,以及激活函数(activation function) g

1.2.1 weights, bias和activation function的作用

why weights and bias?
在这里插入图片描述

  • Weights shows the strength of the particular node.
  • A bias value allows you to shift the activation function curve up or down.
     

why activation function?

  • It is used to determine the output of neural network like yes or no. It maps the resulting values in between 0 to 1 or -1 to 1 etc. (depending upon the function).

在这里插入图片描述

1.3 如何形象的解释为什么神经网络层数越多效果越好?

比如某个神经元接收了来自它前一层的身高,体重两个输入,经过加权后,通过带激活阈值(偏置)后的激活函数,输出了一个新的值,这个值的抽象含义可能被解释为“身材匀称度”;
另一个神经元接也收来自它前一层的眼睛大小,嘴巴大小输入,也经过加权、偏置和激活函数,输出了一个新的值,这个值的抽象含义可能被解释为“五官端正度”;
这前一层抽象的“身材匀称度”和“五官端正度”以及其他更多的特征又会继续被输入下一层被以同样的方法处理,得出更多更高层次的抽象特征,比如“帅气度”,随着隐藏层的加深,深层的抽象特征可能抽象得连设计者自己也无法解释。
最后通过层层特征的抽象和输出,神经网络作出它对输入特征的分类——这个人是谁:吴彦祖还是八两金还是其他阿猫阿狗。
可见,浅层神经网络可以表示的特征抽象程度不高,而层次越深,特征的抽象程度越高,也就是在某些特定任务上所谓的“效果越好”,这也是为什么深度神经网络可以做出很多只有人类才能做到的需要高度抽象理解能力的事情。
From:黄卓驹

2. 感知机相关;利用tensorflow等工具定义简单的几层网络(激活函数sigmoid),递归使用链式法则来实现反向传播。

2.1 什么是感知机?

感知机是二分类的线性分类模型,属于监督学习,用于分类。
perceptron
简单说:
感知机 = 一层的神经网络
好几层的感知机 = 神经网络

白话理解感知机:

假设有一次考试,分为语文,数学,英语,满分都是100分。但是,语文,数学,英语占的权重(weight)不一样。同时,我们还需要根据考试难度,在最后总分上面,进行一些加分或者减分的调整(bias)。最后,根据一个标准(激活函数 Step Function)来定考试合格或者不合格(output)。
 
如果教务处说,我们是外国语学校,对于英语成绩比较看重,则我们给予这样的英语比较高的权重。
X1:语文成绩 W1:0.3
X2:数学成绩 W2:0.2
X3:英语成绩 W3: 0.5
 
然后,由于这次考试难度比较高,则每个人都加5分 (这个其实叫做 偏置项 bias)
 
X0 = 1 W0 = 5
 
成绩 = X0 * W0 + X1 * W1 + X2 * W2 + X3 * W3
然后,如果成绩为60分及以上则为合格。(激活函数 Step Function)
如果 成绩 >= 60 ,则合格
成绩 < 60 ,则不合格
 
OK,这样一个简单的感知机就做成了。在权重(W0,W1,W2,W3)和 Step Function(合格标准)定下来的时候,它可以根据输入(各科成绩),求得输出(是否合格)了。
 
例如:
 
语文成绩 50 * 0.3 = 15
数学成绩 40 * 0.2 = 8
英语成绩 80 * 0.5 = 40
附加分 5
成绩 15 + 8 + 40 + 5 = 68 =>合格
 
语文成绩 80 * 0.3 = 24
数学成绩 50 * 0.2 = 10
英语成绩 40 * 0.5 = 20
附加分 5
成绩 24 + 10 + 20 + 5 = 59 => 不合格
 
当然,一般来讲,感知机往往是激活函数(StepFunction)是事先决定的,作为训练数据的输入,输出是已知的,权重则是需要通过机器学习来获得的。我们的例子中,合格标准是事先决定的,60分及格,然后给出一部分数据:某些人的语文成绩,数学成绩,英语成绩 ,是否合格,然后通过机器学习,将各科的权重计算出来,获得一个模型。然后利用这个模型,通过输入 语文成绩,数学成绩,英语成绩,来判定是否合格。
 
当然,如果在训练数据比较少的时候,这个权重可能计算的不是很准确,数据越多,权重越准确。
 
语文成绩 50 数学成绩 40 数学成绩 40 附加分 5 合格
语文成绩 80 数学成绩 50 数学成绩 40 附加分 5 不合格
 
能够满足这样条件的权重有很多很多,所以机器学习的结果可能不是很好。
但是如果有足够的数据,则权重的计算结果则会非常理想。
 
最后再回来说一下,为什么叫感知机,其实最简单的,最原始的时候,感知机的输出就是 0(不合格) 或者 1(合格).结果能被感知,或者不能被感知。当然,随着研究的深入,则输出形式也越来越丰富了,不仅限于是否,也可以是数值或者其他形式的东西。例如,感知机做线性回归的时候,则是数值作为输出。

2.2 认识感知机

分步理解感知机:

第一步:输入向量和权重进行点乘,假设叫做k
第一步
第二步:把所有的k都加起来得到加权和
在这里插入图片描述
第三步:将其扔入激活函数中(下图为单位阶跃函)
单位阶跃函
使用场景:
在这里插入图片描述

2.3 建立简单的神经网络

  • 利用tensorflow建立简单的三层网络(输入/隐藏/输出)(激活函数sigmoid)参考
import tensorflow as tf
import numpy as np

print('building a neural network...')
#创建一个神经网络
def add_layer(inputs,in_size,out_size,activation_function=None): 
    
    """
    :param input: 数据输入
    :param in_size: 输入大小(即前一层神经元个数)
    :param out_size: 输出大小(即本层神经元个数)
    :param activation_function: 激活函数(默认没有,因为输入层无激活函数)
    """
    
    Weights = tf.Variable(tf.random_normal([in_size,out_size])) #权值初始化:in_size * out_size
    biases = tf.Variable(tf.zeros([1,out_size])+0.1) #权值初始化初始化:out_size(即本层神经元个数)
    Wx_plus_b = tf.matmul(inputs,Weights)+biases #inputs * Weight + biases
    #按照是否有激活函数,输出:
    if activation_function is None:
        outputs = Wx_plus_b
    else:
        outputs = activation_function(Wx_plus_b)
    return outputs
 
print( )

print('preparing data...')
x_data = np.linspace(-1,1,300)[:,np.newaxis] #创建输入数据 [-1,1]区间,300个单位,np.newaxis分别是在列(第二维)上增加维度,原先是(300,)变为(300,1)
noise = np.random.normal(0,0.05,x_data.shape) #噪点
y_data = np.square(x_data) - 0.5 + noise #输入对应的输出
y_data=np.square(x_data)+1+noise
print('fertig!')

#define placeholder for inputs to network
#placeholder描述等待输入的节点,只需要指定类型即可
xs = tf.placeholder(tf.float32,[None,1])
ys = tf.placeholder(tf.float32,[None,1])
print('placehoder fertig!')
#三层神经,输入层(1个神经元),隐藏层(10神经元),输出层(1个神经元)
hidden_layer1 = add_layer(xs,1,10,activation_function=tf.nn.sigmoid) #隐藏层
prediction = add_layer(hidden_layer1,10,1,activation_function=None) #输出层
print('hidden layer fertig! output layer fertig!')
#the error between prediciton and real data
#损失函数
loss=tf.reduce_mean(tf.reduce_sum(tf.square(ys-prediction) ,reduction_indices=[1] ))
#选择 optimizer 使 loss 达到最小
train_step=tf.train.GradientDescentOptimizer(0.1).minimize(loss) #学习效率为0.1,梯度下降法使误差最小
print('optimizer fertig!')
#前面是定义,在运行模型前先要初始化所有变量:
init=tf.global_variables_initializer() 
#接下来把结构激活,session像一个指针指向要处理的地方:
sess=tf.Session()
#执行初始化
sess.run(init) 
print('session initialized')

# 迭代 1000 次学习,sess.run optimizer
for i in range(1000)<
  • 8
    点赞
  • 66
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值