单一神经元
学习关于线性单元:深度学习的基石
欢迎来到深度学习!
欢迎来到kaggle的深度学习介绍课程系列!你将学到要建立自己的深度神经网络的所有知识。借助Keras和Tensor flow,你将学到:
- 如何让创建全连接的神经网络架构;
- 将神经网络应用于两类经典的机器学习问题:回归和聚类
- 使用随机梯度下降训练神经网络
- 使用省略(dropout)和批量正常化(batch normalization)和其他技巧来提升性能。
介绍中将使用完全可运行的例子,在练习中,你将深入了解这些话题,并且将他们应用于实际数据集中。
让我们开始吧!
什么是深度学习?
- 近些年最深入人心的人工智能成果就是在深度学习领域的。自然语言翻译、图像识别、还有游戏AI都是深度学习模型接近甚至超过人类能力的产物。
- 那什么是深度学习呢?深度学习时一种以大量计算为特性的机器学习方法。如此大量的计算已经使得深度学习模型解决了许多来自生活数据集、极具挑战性、复杂且具有层级特征的规律问题。
- 由于它的能力和可扩展性,神经网络已经成为深度学习的代名词。神经网络式由众多神经元构成的,每个神经元仅负责一个简单计算。而神经网络的能力则来源于这些神经元连接的复杂性。
线性单元
- 那么让我们从神经网络的基本元素:单一神经元开始吧;
- 单一神经元可以表示为式子:y = wx + b
x
表示输入,神经元本身有一个 权重w
。无论什么输入流经神经元,你都将输入值乘权重。所以对于每个输入的x
到达神经元时就变成了w * x
神经元通过调节权重来“学习”。- 其中
b
表示一中特殊的权重叫 偏差。偏差和输入数据无关,相反,如果我们将输入看成1,那么经过神经元后得到的就是b
。偏差提供了一种与输入无关的修改输出的方式。 y
作为神经元的最终输出。想要获得就走公式y = w * x + b
。我们又称这个神经元的激活值是y = w * x + b
。
式子
y = w * x + b
看着熟悉不?
没错,就是直线的斜截式,w是斜率,y表示截距。
案例:使用单一神经元做模型
- 虽然单一神经元仅仅在更大的网络中发挥作用,但是我们从单一神经元作为基础开始学习要方便很多。
- 设想一下我们使用80麦片的数据集。模型将
Suger
(每克含糖量)作为输入,要求计算calories
(每份的卡路里量)作为输出,我们就能得到偏差值是90,权重为2.5 。我们可以来估测提供的每5克糖的卡路里量是 calories=2.5×5+90=102.5 。
多重输入
- 80麦片数据集中不止有糖分作为特征,如果我们想将模型中包括纤维、蛋白质怎么办?很简单。我们可以将众多输入接入神经元,每一个代表不同的特征,要得到输出,我们就分别将输入乘权重加上偏差值,最后在求和就可以了。这个神经元的公式就变成了:y=w0x0+w1x1+w2x2+b 。有两个输入的单一神经元就组成一个平面,多个输入的神经元就组成一个超平面。
Keras中的线性单元
- 创建模型的最简单方法就是使用
keras.Sequential
,它创建一个许多层 构成的神经网络,我们可以使用Dense层来创建上面提到的模型(这个我们下节再说)。 - 我们可以定义一个线性模型输入三种特征(‘sugars’, ‘fiber’, ‘protein’),外加单个输出(‘calories’)
from tensorflow import keras
from tensorflow.keras import layers
# Create a network with 1 linear unit
model = keras.Sequential([
layers.Dense(units=1, input_shape=[3])
])
- 第一个参数
units
表示我们要几个输出,这里只有一个; - 第二个参数
input_shape
告诉Keras输入的维度,我们将它设置为input_shape=[3]
保证模型将接收三个特征作为输入(‘sugars’, ‘fiber’, ‘protein’) - 那么,这个模型就可以用数据来训练啦!
为什么
input_shape
是一个Python列表?
我们这里用到的数据是表格式数据,例如Pandas的数据框架。我们每个数据集中的特征作为一个输入。特征是按一列一列排列的。所以input_shape=[num_columns]。Keras这里允许使用列表是因为要使用更复杂的数据集,例如图片数据可能就要使用三维:[高度,宽度,通道]。