Chuyển đến nội dung chính

Xây dựng Mô hình Mạng Nơ-ron (NN) trong R

Trong hướng dẫn này, bạn sẽ học cách tạo mô hình Mạng Nơ-ron trong R.
Đã cập nhật 5 thg 10, 2026  · 10 phút đọc

Khám phá cùng AI

ChatGPTClaudePerplexity

Xây dựng Mô hình Mạng Nơ-ron NN trong R

Giới thiệu về Mạng Nơ-ron

Mạng nơ-ron hay mạng nơ-ron mô phỏng là một phân nhánh của machine learning lấy cảm hứng từ não người. Chúng mô phỏng cách các nơ-ron sinh học giao tiếp với nhau để đưa ra quyết định. 

Một mạng nơ-ron gồm lớp đầu vào, các lớp ẩn và lớp đầu ra. Lớp đầu tiên nhận dữ liệu thô, dữ liệu được xử lý qua nhiều lớp ẩn, và lớp cuối cùng tạo ra kết quả. 

Trong ví dụ dưới đây, chúng tôi mô phỏng quá trình huấn luyện của mạng nơ-ron để phân loại dữ liệu dạng bảng. Chúng ta có các tham số X1 và X2 được truyền qua 2 lớp ẩn gồm 4 và 2 nơ-ron để tạo đầu ra. Qua nhiều vòng lặp, mô hình ngày càng phân loại mục tiêu tốt hơn. 

quá trình huấn luyện mạng nơ-ron để phân loại dữ liệu dạng bảng

Hình được tạo bằng TF Playground

Các thuật toán học sâu hay mạng nơ-ron sâu gồm nhiều lớp ẩn và nút. “Sâu” thể hiện độ sâu của mạng nơ-ron. Chúng thường được dùng để giải quyết các bài toán phức tạp như phân loại ảnh, nhận dạng giọng nói và sinh văn bản.

Tìm hiểu thêm về mạng nơ-ron qua Hướng dẫn Deep Learning của chúng tôi. Bạn sẽ học cách Hàm kích hoạt, Hàm mất mát và Lan truyền ngược hoạt động để tạo ra kết quả chính xác. 

Các loại Mạng Nơ-ron

Nhiều loại mạng nơ-ron được dùng cho các ứng dụng machine learning nâng cao. Không có một kiến trúc mô hình duy nhất phù hợp cho mọi bài toán. Loại mạng nơ-ron cổ điển nhất là Perceptron, do Frank Rosenblatt tạo ra năm 1958. 

Trong phần này, chúng ta sẽ điểm qua 5 loại mạng nơ-ron phổ biến nhất đang được dùng trong ngành công nghệ. 

Mạng Nơ-ron Truyền thẳng (Feedforward)

Mạng nơ-ron truyền thẳng gồm lớp đầu vào, các lớp ẩn và lớp đầu ra. Gọi là truyền thẳng vì dữ liệu chảy theo hướng tiến, không có lan truyền ngược. Chủ yếu dùng trong Phân loại, Nhận dạng giọng nói, Nhận dạng khuôn mặt và Nhận dạng mẫu.

Perceptron Nhiều Lớp (MLP)

Perceptron nhiều lớp (MLP) khắc phục hạn chế của mạng truyền thẳng là không học được qua lan truyền ngược. Nó hai chiều và gồm nhiều lớp ẩn cùng các hàm kích hoạt. MLP dùng lan truyền tiến cho đầu vào và lan truyền ngược để cập nhật trọng số. Đây là các mạng nơ-ron cơ bản đã đặt nền móng cho thị giác máy tính, công nghệ ngôn ngữ và các mạng khác. 

Lưu ý: MLP gồm các nơ-ron sigmoid, không phải perceptron, vì các bài toán thực tế là phi tuyến.

Mạng Nơ-ron Tích chập (CNN)

Mạng nơ-ron tích chập (CNN) thường dùng trong thị giác máy tính, nhận dạng ảnh và nhận dạng mẫu. Nó dùng nhiều lớp tích chập để trích xuất đặc trưng quan trọng từ ảnh. Lớp tích chập trong CNN dùng một ma trận tùy chỉnh (bộ lọc) để trượt trên ảnh và tạo bản đồ đặc trưng. 

Thường thì CNN gồm lớp đầu vào, lớp tích chập, lớp gộp, lớp kết nối đầy đủ và lớp đầu ra. Đọc hướng dẫn Python Convolutional Neural Networks (CNN) với TensorFlow để tìm hiểu thêm về cách CNN hoạt động. 

Mạng Nơ-ron Hồi quy (RNN)

Mạng nơ-ron hồi quy (RNN) thường dùng cho dữ liệu tuần tự như văn bản, chuỗi ảnh và chuỗi thời gian. Chúng giống mạng truyền thẳng, ngoại trừ việc nhận đầu vào từ các chuỗi trước đó thông qua vòng phản hồi. RNN được dùng trong NLP, dự báo doanh số và dự báo thời tiết. 

RNN gặp vấn đề tiêu biến gradient, được giải quyết bởi các phiên bản nâng cao như Mạng Bộ nhớ Ngắn hạn (LSTM) và Mạng Đơn vị Hồi quy Cổng (GRU). Đọc Hướng dẫn Mạng Nơ-ron Hồi quy (RNN) để tìm hiểu thêm về LSTM và GRU. 

Triển khai Mạng Nơ-ron trong R

Chúng ta sẽ học cách tạo mạng nơ-ron với các gói R phổ biến là neuralnet và Keras. 

Ở ví dụ đầu, chúng ta sẽ tạo một mạng nơ-ron đơn giản với nỗ lực tối thiểu, và ở ví dụ thứ hai, chúng ta sẽ xử lý một bài toán nâng cao hơn bằng gói Keras. 

Hãy thiết lập môi trường R bằng cách tải các thư viện và phụ thuộc cần thiết. 

install.packages(c('neuralnet','keras','tensorflow'),dependencies = T)

Triển khai Mạng Nơ-ron đơn giản trong R

Trong ví dụ đầu tiên, chúng ta sẽ dùng dữ liệu tích hợp sẵn của R là iris và giải bài toán phân loại đa lớp với một mạng nơ-ron đơn giản. 

Chúng ta sẽ bắt đầu bằng cách nhập các gói R thiết yếu để thao tác dữ liệu và huấn luyện mô hình. 

library(tidyverse)
library(neuralnet)

Phân tích dữ liệu

Bạn có thể truy cập dữ liệu bằng cách gõ `iris` và chạy trong console R. Trước khi huấn luyện dữ liệu, chúng ta cần chuyển các cột kiểu ký tự thành factor.

Lưu ý: chúng tôi dùng workspace R của DataCamp để chạy các ví dụ. 

iris <- iris %>% mutate_if(is.character, as.factor)

Hàm `summary` được dùng để phân tích thống kê và phân bố dữ liệu. 

summary(iris)

Như có thể thấy, dữ liệu của chúng ta cân bằng. Cả ba lớp mục tiêu đều có 50 mẫu. 

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 

Chia tập Train và Test

Chúng ta sẽ đặt seed để tái lập và chia dữ liệu thành các tập train và test để huấn luyện và đánh giá mô hình. Tỷ lệ chia là 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,]

Huấn luyện Mạng Nơ-ron

Gói neuralnet đã cũ, nhưng vẫn phổ biến trong cộng đồng R. 

Hàm `neuralnet` khá đơn giản. Nó không cung cấp sự linh hoạt để tạo kiến trúc mô hình tùy biến hoàn toàn. 

Trong trường hợp của chúng ta, ta cung cấp cho nó một công thức machine learning và dữ liệu, giống như GLM. Công thức gồm biến mục tiêu và các đặc trưng. 

Sau đó, chúng ta tạo hai lớp ẩn, lớp đầu có bốn nơ-ron và lớp thứ hai có hai nơ-ron. 

model = neuralnet(
    Species~Sepal.Length+Sepal.Width+Petal.Length+Petal.Width,
data=train_data,
hidden=c(4,2),
linear.output = FALSE
)

Để xem kiến trúc mô hình, chúng ta dùng hàm `plot`. Nó cần đối tượng mô hình và tham số `rep`. 

plot(model,rep = "best")

Mô hình NN

Đánh giá Mô hình

Đối với ma trận nhầm lẫn:

  1. Chúng ta sẽ dự đoán các hạng mục dùng tập test. 
  2. Tạo danh sách tên hạng mục.
  3. Tạo dataframe dự đoán và thay thế đầu ra số bằng nhãn. 
  4. Dùng các bảng để hiển thị giá trị ‘thực tế’ và ‘dự đoán’ cạnh nhau. 
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)

Chúng ta thu được kết quả gần như hoàn hảo. Có vẻ mô hình dự đoán sai ba mẫu. Ta có thể cải thiện kết quả bằng cách thêm nhiều nơ-ron ở mỗi lớp. 

           prediction_label
            setosa versicolor virginica
  setosa          8          0        0
  versicolor      0         13        0
  virginica       0          3        6 

Để kiểm tra độ chính xác, trước hết ta phải chuyển các giá trị phân loại thực tế thành số và so sánh với các giá trị dự đoán. Kết quả nhận được là một danh sách các giá trị boolean. 

Ta có thể dùng hàm `sum` để đếm số giá trị `TRUE` và chia cho tổng số mẫu để tính độ chính xác. 

check = as.numeric(test_data$Species) == max.col(pred)
accuracy = (sum(check)/nrow(test_data))*100
print(accuracy)

Mô hình đã dự đoán với độ chính xác 90%. 

90

Lưu ý: mã nguồn cho ví dụ này có trên R workspace: Xây dựng Mô hình Mạng Nơ-ron (NN) trong R.

Mạng Nơ-ron Tích chập trong R với Keras

Trong ví dụ này, chúng ta sẽ dùng Keras và TensorFlow để xây dựng và huấn luyện một mô hình Mạng Nơ-ron Tích chập cho tác vụ phân loại ảnh. Chúng ta sẽ dùng bộ dữ liệu ảnh cifar10 gồm 60.000 ảnh màu 32x32 được gán nhãn trong mười hạng mục.

Bộ dữ liệu CIFAR-10

Hình từ CIFAR-10

Nhập các gói R thiết yếu. 

library(keras)
library(tensorflow)

Chuẩn bị dữ liệu

Chúng ta sẽ nhập bộ dữ liệu tích hợp sẵn của Keras và chia thành các tập train và test. 

c(c(x_train, y_train), c(x_test, y_test)) %<-% dataset_cifar10()

Chia các đặc trưng của tập train và test cho 255 để chuẩn hóa dữ liệu. 

x_train <- x_train / 255
x_test <-  x_test / 255

Xây dựng mô hình

Keras API mang lại sự linh hoạt để xây dựng kiến trúc mạng nơ-ron phức tạp, tùy biến hoàn toàn. 

Trong trường hợp này, chúng ta sẽ tạo nhiều lớp tích chập, theo sau là lớp gộp cực đại, lớp dropout, lớp dày đặc (dense) và lớp đầu ra. 

Chúng ta dùng ‘Leaky ReLU’ làm hàm kích hoạt cho tất cả các lớp trừ lớp đầu ra. Với lớp đầu ra, chúng ta dùng ‘softmax’. 

Cần đặt hình dạng đầu vào của lớp tích chập 2D đầu tiên khớp với kích thước ảnh (32,32,3) của tập huấn luyện. 

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')

Để xem kiến trúc mô hình, chúng ta sẽ dùng hàm `summary`. 

summary(model)

Chúng ta có hai lớp tích chập theo sau là một lớp gộp cực đại, thêm hai lớp tích chập nữa, một lớp gộp cực đại, một lớp làm phẳng để biến đầu ra đã lọc cực đại thành các vector, rồi đến hai lớp dense. 

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
________________________________________________________________________________

Biên dịch mô hình

  1. Chúng ta sẽ đặt tốc độ học bằng hàm lịch trình giảm dần theo hàm mũ. Nó giảm tốc độ học sau mỗi 1500 bước xuống 0,98.
  2. Truyền đối tượng tốc độ học vào bộ tối ưu Adamax.
  3. Hàm mất mát sẽ là sparse categorical cross-entropy.
  4. Biên dịch mô hình bằng hàm mất mát, bộ tối ưu và chỉ số đánh giá hiệu năng.
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"
)

Huấn luyện mô hình

Chúng ta sẽ fit mô hình và lưu các chỉ số đánh giá vào `history`. 

  • Huấn luyện mô hình trong 10 epoch và đặt kích thước batch là 32. 
  • Thêm tập test để xác thực.
  • Tham số `shuffle` sẽ xáo trộn dữ liệu huấn luyện ở đầu mỗi epoch. 
history <- model %>% fit(
  x_train, y_train,
  batch_size = 32,
  epochs = 10,
  validation_data = list(x_test, y_test),
  shuffle = TRUE
)

Đánh giá mô hình

Bạn có thể đánh giá mô hình trên tập test bằng hàm `evaluate`, và nó sẽ trả về mất mát và độ chính xác cuối cùng. 

model %>% evaluate(x_test, y_test)

Huấn luyện lại mô hình với 50 epoch sẽ cải thiện độ chính xác. 

Loss 0.648191571235657 Accuracy 0.776799976825714

Để vẽ đồ thị đường biểu diễn mất mát và độ chính xác theo từng epoch, chúng ta dùng hàm `plot`. 

plot(history)

Nhìn vào đồ thị, ta thấy đường chưa phẳng. Điều này nghĩa là với số epoch cao hơn, chúng ta có thể cải thiện các chỉ số của mô hình. 

đồ thị mất mát và độ chính xác của mô hình CNN

Nếu bạn muốn tìm hiểu thêm về Keras API và cách dùng nó để xây dựng mạng nơ-ron sâu, hãy xem hướng dẫn keras: Deep Learning trong R. 

Ứng dụng của Mạng Nơ-ron

Ta có thể bắt gặp các ví dụ mạng nơ-ron trong đời sống ở khắp nơi, từ ứng dụng di động đến kỹ thuật. Nhờ sự bùng nổ gần đây của các mô hình ngôn ngữ và thị giác quy mô lớn, ngày càng nhiều công ty quan tâm triển khai mạng nơ-ron sâu để tăng lợi nhuận và sự hài lòng của khách hàng. 

Trong phần này, chúng ta sẽ tìm hiểu 10 ứng dụng hàng đầu của mạng nơ-ron đang định hình thế giới hiện đại. 

1. Dự báo Dữ liệu Bảng

Các mạng nơ-ron đơn giản khá hiệu quả trên dữ liệu bảng lớn. Chúng ta có thể dùng cho bài toán phân loại, phân cụm và hồi quy. 

2. Dự báo Giá Cổ phiếu

Nhiều công ty đang dùng LSTM, GRU và RNN cho dự báo tài chính. Điều này giúp họ ra quyết định tốt hơn. 

3. Ảnh Y khoa

Phát hiện ung thư vú, phát hiện bất thường và phân đoạn ảnh là một số ứng dụng của mạng nơ-ron tích chập. Nhờ các mô hình transformer tiền huấn luyện, chúng ta đã thấy nghiên cứu tiến bộ trong phòng ngừa bệnh và phát hiện sớm các bệnh hiểm nghèo.  

4. Thương mại điện tử

Gợi ý sản phẩm, trải nghiệm cá nhân hóa và chatbot là một số ứng dụng của mạng nơ-ron trong Thương mại điện tử. Các mô hình này chủ yếu dùng cho phân cụm, xử lý ngôn ngữ tự nhiên và thị giác máy tính để cải thiện trải nghiệm khách hàng trên nền tảng. 

5. Ảnh Sinh

Nhờ sự phổ biến của DALL·E 2 và stable diffusion, lĩnh vực này đã trở nên phổ biến rộng rãi. Các công ty như Canva và Adobe đã triển khai khả năng sinh ảnh để tăng số lượng người dùng. Ngoài làn sóng chính thống, ảnh sinh được dùng trong mọi ngành để tạo dữ liệu tổng hợp nhằm cải thiện hiệu năng, độ ổn định và giảm thiên lệch của mô hình. 

6. Văn bản Sinh

ChatGPT, GPT-3 và GPT-NEO là các mô hình mạng nơ-ron sâu đang chiếm lĩnh lĩnh vực này. Chúng được dùng cho trợ lý lập trình, chatbot, dịch thuật, hỏi/đáp và hơn thế nữa. Ở khắp nơi, và các công ty thấy dễ dàng tích hợp vào hệ thống hiện tại.

7. Chatbot Chăm sóc Khách hàng

DailoGPT và Blenderbot là các mô hình hội thoại phổ biến nâng cao trải nghiệm chatbot của bạn. Chúng thích ứng tốt và có thể tinh chỉnh cho mục đích cụ thể. Trong tương lai, chúng ta sẽ không còn thời gian chờ lâu; các chatbot này sẽ hiểu vấn đề của bạn và cung cấp giải pháp theo thời gian thực. 

8. Robot

Học tăng cường và các mô hình mạng nơ-ron thị giác máy tính đang đóng vai trò lớn trong chuyển đổi ngành công nghiệp. Ví dụ, quản lý kho hoàn toàn tự động, nhà máy và trải nghiệm mua sắm. 

9. Nhận dạng Giọng nói

Các mô hình mạng nơ-ron cho nhận dạng giọng nói, chuyển văn bản thành giọng nói và phát hiện hoạt động âm thanh được dùng cho trợ lý giọng nói, chuyển biên tự động và ứng dụng truyền thông nâng cao. 

10. Đa phương thức

Văn bản thành Ảnh (DALLE-2), Ảnh thành Văn bản, Hỏi đáp Thị giác và trích xuất đặc trưng là một số ứng dụng trong mạng nơ-ron đa phương thức. Trong tương lai, bạn sẽ thấy văn bản thành video có âm thanh. Bạn sẽ có thể tạo cả một bộ phim chỉ bằng cách cung cấp kịch bản.

Kết luận

Các gói Keras và TensorFlow cho R cung cấp đầy đủ công cụ để tạo kiến trúc mô hình phức tạp cho từng tác vụ cụ thể. Bạn có thể tải dữ liệu, tiền xử lý, xây dựng và tối ưu mô hình, cũng như đánh giá mô hình chỉ với vài dòng mã. Hơn nữa, với TensorFlow, bạn có thể theo dõi thí nghiệm, cấu hình GPU và triển khai mô hình vào sản xuất. 

Trong hướng dẫn này, chúng ta đã học những điều cơ bản về mạng nơ-ron, các loại kiến trúc mô hình và ứng dụng. Ngoài ra, chúng ta đã học cách huấn luyện một mạng nơ-ron đơn giản bằng `neuralnet` và một mạng nơ-ron tích chập bằng `keras`. Hướng dẫn bao quát việc xây dựng, biên dịch, huấn luyện và đánh giá mô hình. 

Tìm hiểu thêm về TensorFlow và Keras API qua khóa học Giới thiệu TensorFlow trong R. Bạn sẽ học về tensorboard và các API khác của TensorFlow, xây dựng mạng nơ-ron sâu, và cải thiện hiệu năng mô hình bằng regularization, dropout và tối ưu siêu tham số.  

Chủ đề
R
Khoa học Dữ liệu
Trí tuệ Nhân tạo

Khóa học R

Khóa học

Nhập môn Ngôn ngữ lập trình R

4 giờ
3.1M
Nắm vững kiến thức cơ bản về phân tích dữ liệu trong R, gồm vectors, lists và data frames; luyện tập R với các data set thực tế.
Xem chi tiếtRight Arrow
Bắt Đầu Khóa Học
Xem thêmRight Arrow