课程

神经网络简介
神经网络(或模拟神经网络)是受人脑启发的机器学习分支。它们模拟生物神经元彼此通信以做出决策的方式。
一个神经网络由输入层、隐藏层和输出层组成。第一层接收原始输入,经由多个隐藏层处理,最后一层生成结果。
在下面的示例中,我们模拟了用于对表格数据进行分类的神经网络训练过程。参数 X1 和 X2 经过两个隐藏层(分别包含 4 和 2 个神经元)后产生输出。经过多次迭代后,模型在分类目标方面的表现会不断提升。

图片由 TF Playground 创建
深度学习算法或深度神经网络由多个隐藏层和节点组成。“深度”指的是神经网络的层数深度。它们通常用于解决图像分类、语音识别和文本生成等复杂问题。
通过阅读我们的深度学习教程进一步了解神经网络。您将学习激活函数、损失函数和反向传播如何协同工作以产生准确结果。
神经网络的类型
在高级机器学习应用中会使用多种类型的神经网络,并不存在一种通用的模型架构适用于所有任务。最早的神经网络类型是感知机(Perceptron),由 Frank Rosenblatt 于 1958 年提出。
本节将介绍业界最常用的 5 种神经网络类型。
前馈神经网络
前馈神经网络由输入层、隐藏层和输出层组成。之所以称为前馈,是因为数据沿前向方向流动,不存在反向传播。它主要用于分类、语音识别、人脸识别和模式识别。
多层感知器
多层感知器(MLP)解决了前馈神经网络无法通过反向传播学习的缺陷。它是双向的,由多个隐藏层和激活函数组成。MLP 使用前向传播处理输入,使用反向传播更新权重。它们是奠定计算机视觉、语言技术及其他神经网络基础的基本网络。
注意:MLP 由 sigmoid 神经元组成,而非感知机,因为现实世界问题是非线性的。
卷积神经网络(CNN)
卷积神经网络(CNN)通常用于计算机视觉、图像识别和模式识别。它通过多个卷积层从图像中提取重要特征。CNN 中的卷积层使用自定义矩阵(滤波器)在图像上进行卷积并生成特征图。
一般而言,卷积神经网络由输入层、卷积层、池化层、全连接层和输出层组成。阅读我们的使用 TensorFlow 的 Python 卷积神经网络(CNN)教程,了解 CNN 的工作原理。
循环神经网络(RNN)
循环神经网络(RNN)常用于文本、图像序列和时间序列等序列数据。它们与前馈网络类似,但通过反馈回路从先前的序列获取输入。RNN 广泛应用于自然语言处理、销量预测和天气预报。
RNN 存在梯度消失问题,通常通过其改进版本长短期记忆网络(LSTM)和门控循环单元网络(GRU)来解决。阅读循环神经网络(RNN)教程以进一步了解 LSTM 和 GRU。
在 R 中实现神经网络
我们将使用流行的 R 包 neuralnet 和 Keras 来创建神经网络。
在第一个示例中,我们将以最小化工作量创建一个简单的神经网络;在第二个示例中,我们将使用 Keras 包解决更高级的问题。
让我们通过下载必要的库和依赖项来设置 R 环境。
install.packages(c('neuralnet','keras','tensorflow'),dependencies = T)
在 R 中实现简单神经网络
在第一个示例中,我们将使用内置的 R 数据集 iris,并用一个简单的神经网络解决多分类问题。
首先导入用于数据处理和模型训练的基础 R 包。
library(tidyverse)
library(neuralnet)
数据分析
您可以在 R 控制台中输入 `iris` 并运行以查看数据。在训练之前,我们需要将字符型列转换为因子。
注意:我们使用 DataCamp 的 R Workspace 运行示例。
iris <- iris %>% mutate_if(is.character, as.factor)
`summary` 函数用于统计分析和查看数据分布。
summary(iris)
可以看到,我们的数据是均衡的。三个目标类别各有 50 个样本。
Sepal.Length Sepal.Width Petal.Length Petal.Width
Min. :4.300 Min. :2.000 Min. :1.000 Min. :0.100
1st Qu.:5.100 1st Qu.:2.800 1st Qu.:1.600 1st Qu.:0.300
Median :5.800 Median :3.000 Median :4.350 Median :1.300
Mean :5.843 Mean :3.057 Mean :3.758 Mean :1.199
3rd Qu.:6.400 3rd Qu.:3.300 3rd Qu.:5.100 3rd Qu.:1.800
Max. :7.900 Max. :4.400 Max. :6.900 Max. :2.500
Species
setosa :50
versicolor:50
virginica :50
划分训练集与测试集
为了可复现性,我们将设置随机种子,并将数据按 80:20 划分为训练集和测试集,用于模型训练与评估。
set.seed(245)
data_rows <- floor(0.80 * nrow(iris))
train_indices <- sample(c(1:nrow(iris)), data_rows)
train_data <- iris[train_indices,]
test_data <- iris[-train_indices,]
训练神经网络
neuralnet 包虽已较为过时,但在 R 社区仍然很受欢迎。
`neuralnet` 函数使用简单,但无法自由创建完全可定制的模型架构。
在这里,我们像使用 GLM 一样,提供机器学习公式和数据。公式由目标变量和特征构成。
随后我们创建两个隐藏层:第一层 4 个神经元,第二层 2 个神经元。
model = neuralnet(
Species~Sepal.Length+Sepal.Width+Petal.Length+Petal.Width,
data=train_data,
hidden=c(4,2),
linear.output = FALSE
)
要查看模型架构,我们将使用 `plot` 函数。它需要模型对象和 `rep` 参数。
plot(model,rep = "best")

模型评估
关于混淆矩阵:
- 使用测试数据集进行类别预测。
- 创建类别名称列表。
- 创建预测数据框,并将数值输出替换为标签。
- 使用表格并排显示“实际值”和“预测值”。
pred <- predict(model, test_data)
labels <- c("setosa", "versicolor", "virginca")
prediction_label <- data.frame(max.col(pred)) %>%
mutate(pred=labels[max.col.pred.]) %>%
select(2) %>%
unlist()
table(test_data$Species, prediction_label)
我们得到的结果几乎完美。模型似乎错误预测了 3 个样本。通过在每一层添加更多神经元,可以进一步改进结果。
prediction_label
setosa versicolor virginica
setosa 8 0 0
versicolor 0 13 0
virginica 0 3 6
要计算准确率,我们需要先将实际的分类值转换为数值形式,并与预测值进行比较。这样会得到一个布尔值列表。
我们可以使用 `sum` 函数统计 `TRUE` 的数量,并除以样本总数以获得准确率。
check = as.numeric(test_data$Species) == max.col(pred)
accuracy = (sum(check)/nrow(test_data))*100
print(accuracy)
该模型的预测准确率为 90%。
90
注意:本示例的代码来源可在 R Workspace 查看:在 R 中构建神经网络(NN)模型。
使用 Keras 在 R 中实现卷积神经网络
在本示例中,我们将使用 Keras 和 TensorFlow 构建并训练用于图像分类任务的卷积神经网络模型。我们将使用 cifar10 图像数据集,其中包含 60,000 张 32x32 的彩色图像,涵盖 10 个类别的标签。

图片来源:CIFAR-10
导入必需的 R 包。
library(keras)
library(tensorflow)
准备数据
我们将导入 Keras 内置数据集,并将其划分为训练集和测试集。
c(c(x_train, y_train), c(x_test, y_test)) %<-% dataset_cifar10()
将训练集和测试集的特征除以 255,以完成数据归一化。
x_train <- x_train / 255
x_test <- x_test / 255
构建模型
Keras API 为我们提供了灵活性,可以构建完全可定制的复杂神经网络架构。
在本例中,我们将创建多个卷积层,随后是最大池化层、dropout 层、全连接层和输出层。
除输出层外,所有层均使用“Leaky ReLU”作为激活函数;输出层使用“softmax”。
我们需要将第一个二维卷积层的输入形状设置为训练数据集中图像的形状(32,32,3)。
model <- keras_model_sequential()%>%
# Start with a hidden 2D convolutional layer
layer_conv_2d(
filter = 16, kernel_size = c(3,3), padding = "same",
input_shape = c(32, 32, 3), activation = 'leaky_relu'
) %>%
# 2nd hidden layer
layer_conv_2d(filter = 32, kernel_size = c(3,3), activation = 'leaky_relu') %>%
# Use max pooling
layer_max_pooling_2d(pool_size = c(2,2)) %>%
layer_dropout(0.25) %>%
# 3rd and 4th hidden 2D convolutional layers
layer_conv_2d(filter = 32, kernel_size = c(3,3), padding = "same", activation = 'leaky_relu') %>%
layer_conv_2d(filter = 64, kernel_size = c(3,3), activation = 'leaky_relu') %>%
# Use max pooling
layer_max_pooling_2d(pool_size = c(2,2)) %>%
layer_dropout(0.25) %>%
# Flatten max filtered output into feature vector
# and feed into dense layer
layer_flatten() %>%
layer_dense(256, activation = 'leaky_relu') %>%
layer_dropout(0.5) %>%
# Outputs from dense layer
layer_dense(10, activation = 'softmax')
要查看模型架构,我们将使用 `summary` 函数。
summary(model)
我们有两层卷积层后接一个最大池化层,然后又是两层卷积层、一个最大池化层、一个扁平化层(将最大筛选后的输出转换为向量),最后是两层全连接层。
Model: "sequential"
________________________________________________________________________________
Layer (type) Output Shape Param #
================================================================================
conv2d_3 (Conv2D) (None, 32, 32, 16) 448
________________________________________________________________________________
conv2d_2 (Conv2D) (None, 30, 30, 32) 4640
________________________________________________________________________________
max_pooling2d_1 (MaxPooling2D) (None, 15, 15, 32) 0
________________________________________________________________________________
dropout_2 (Dropout) (None, 15, 15, 32) 0
________________________________________________________________________________
conv2d_1 (Conv2D) (None, 15, 15, 32) 9248
________________________________________________________________________________
conv2d (Conv2D) (None, 13, 13, 64) 18496
________________________________________________________________________________
max_pooling2d (MaxPooling2D) (None, 6, 6, 64) 0
________________________________________________________________________________
dropout_1 (Dropout) (None, 6, 6, 64) 0
________________________________________________________________________________
flatten (Flatten) (None, 2304) 0
________________________________________________________________________________
dense_1 (Dense) (None, 256) 590080
________________________________________________________________________________
dropout (Dropout) (None, 256) 0
________________________________________________________________________________
dense (Dense) (None, 10) 2570
================================================================================
Total params: 625,482
Trainable params: 625,482
Non-trainable params: 0
________________________________________________________________________________
编译模型
- 我们将使用指数衰减日程函数设置学习率。它会在 1500 步后将学习率按 0.98 衰减。
- 将学习率对象传入 Adamax 优化器。
- 损失函数为稀疏分类交叉熵。
- 使用损失函数、优化器和性能指标编译模型。
learning_rate <- learning_rate_schedule_exponential_decay(
initial_learning_rate = 5e-3,
decay_rate = 0.96,
decay_steps = 1500,
staircase = TRUE
)
opt <- optimizer_adamax(learning_rate = learning_rate)
loss <- loss_sparse_categorical_crossentropy(from_logits = TRUE)
model %>% compile(
loss = loss,
optimizer = opt,
metrics = "accuracy"
)
训练模型
我们将拟合模型,并将评估指标存储在 `history` 中。
- 训练 10 个 epoch,批量大小设为 32。
- 使用测试数据集进行验证。
- `shuffle` 参数将在每个 epoch 开始时打乱训练数据。
history <- model %>% fit(
x_train, y_train,
batch_size = 32,
epochs = 10,
validation_data = list(x_test, y_test),
shuffle = TRUE
)
评估模型
您可以使用 `evaluate` 函数在测试数据集上评估模型,函数会返回最终的损失和准确率。
model %>% evaluate(x_test, y_test)
将模型重新训练至 50 个 epoch 会提升准确率。
Loss 0.648191571235657 Accuracy 0.776799976825714
要绘制每个 epoch 的损失和准确率折线图,我们将使用 `plot` 函数。
plot(history)
从图中可以看到,曲线尚未趋于平坦。这意味着增加 epoch 数可以进一步提升模型指标。

如果您想进一步了解 Keras API 以及如何使用它构建深度神经网络,请查看keras:R 中的深度学习教程。
神经网络的应用
从移动应用到工程领域,现实生活中的神经网络应用无处不在。随着语言和大型视觉模型的兴起,越来越多公司开始关注部署深度神经网络以提升利润和客户满意度。
本节我们将了解正在塑造现代世界的十大神经网络应用。
1. 表格数据预测
简单的神经网络在大规模表格数据上非常有效。我们可以将其用于分类、聚类和回归问题。
2. 股价预测
许多公司使用 LSTM、GRU 和 RNN 进行金融预测,从而做出更优决策。
3. 医学影像
乳腺癌检测、异常检测和图像分割是卷积神经网络的一些典型应用。得益于预训练的 Transformer,我们在疾病预防和致命疾病的早期检测方面看到更前沿的研究进展。
4. 电商
商品推荐、个性化体验和聊天机器人是电商领域中神经网络的常见应用。这些模型主要用于聚类、自然语言处理和计算机视觉,以改善平台上的客户体验。
5. 生成式图像
随着 DALL·E 2 和 Stable Diffusion 的流行,生成式图像已进入主流。Canva 和 Adobe 等公司已经上线了生成式图像功能以吸引更多用户。除了大众关注外,生成式图像还被广泛用于各行业以创建合成数据,提升模型的性能、稳定性并缓解偏差。
6. 生成式文本
ChatGPT、GPT-3 和 GPT-NEO 是主导该领域的深度神经网络模型。它们用于编程辅助、聊天机器人、翻译、问答等。应用无处不在,各家公司也更容易将其集成到现有系统。
7. 客服聊天机器人
DialoGPT 和 BlenderBot 是提升聊天机器人体验的热门对话模型。它们具有适应性,并可针对特定目的进行微调。未来,长时间等待将成为过去;这些机器人能够实时理解您的问题并给出解决方案。
8. 机器人技术
强化学习和计算机视觉神经网络模型在推动行业变革中发挥着重要作用。例如,全自动仓储管理、工厂以及购物体验。
9. 语音识别
语音识别、文本转语音和音频活动检测等神经网络模型被用于语音助手、自动转录和增强通信应用。
10. 多模态
文本生成图像(DALLE-2)、图像转文本、视觉问答以及特征提取等,都是多模态神经网络的应用场景。未来还会出现带音频的文本转视频。您只需提供剧本就能创作一部完整电影。
结语
Keras 和 TensorFlow 的 R 包为我们提供了完整的工具集,以构建适用于特定任务的复杂模型架构。您可以用少量代码完成数据集加载、预处理、模型构建与优化,以及模型评估。此外,借助 TensorFlow,您还能监控实验、配置 GPU,并将模型部署到生产环境。
在本教程中,我们学习了神经网络基础、常见模型架构及其应用;同时还学习了如何使用 `neuralnet` 训练简单神经网络,以及使用 `keras` 训练卷积神经网络。教程涵盖了模型的构建、编译、训练与评估。
通过参加R 中的 TensorFlow 入门课程,进一步了解 TensorFlow 和 Keras API。您将学习 tensorboard 及其他 TensorFlow API,构建深度神经网络,并通过正则化、dropout 和超参数优化来提升模型性能。