I. Các phương pháp tiếp cận khác nhau để xây dựng các ứng dụng giao tiếp

Các nhà phát triển và các nhà nghiên cứu đã xây dựng các ứng dụng giao tiếp, chẳng hạn như chatbot, trong nhiều thập kỷ. Qua nhiều năm, nhiều chiến lược khác nhau đã được xem xét.

1. Phương pháp Rule-Based

Trước sự tiến bộ học máy trong thập kỷ qua, các ứng dụng đàm thoại được xây dựng phổ biến nhất sử dụng phương pháp tiếp cận dựa trên luật lệ. Các nhà phát triển không quen thuộc với học máy thường bắt đầu triển khai của họ với logic dựa trên nguyên tắc. (đại loại là if đầu vào là gì và then đầu ra).

Với khuôn khổ dựa trên nguyên tắc, các nhà phát triển có trách nhiệm triển khai thực hiện logic lõi để phân tích các tin nhắn đến và trả về các phản hồi hữu ích. Logic này thường bao gồm một loạt các quy tắc xác định các kịch bản phản hồi cho một tin nhắn phù hợp với mẫu quy định. Vì phương pháp này khá thủ công, không dựa trên phân tích của AI nên các nhà phát triển phải viết mã xử lý tất cả các tin nhắn và tương tác logic cần thiết bằng tay. Ngay cả các ứng dụng đơn giản thường đòi hỏi hàng trăm quy tắc để xử lý các đoạn đối thoại khác nhau trong một giao diện giao tiếp thông thường.

Phương pháp tiếp cận dựa trên luật lệ thường là cách nhanh nhất để xây dựng và chạy một bản demo cơ bản về trợ lý giao tiếp bằng văn bản hoặc giọng nói. Tuy nhiên chuyển từ demo sang sản phẩm dùng được thì lại khác. Xung đột và dư thừa giữa các quy tắc càng ngày phức tạp hơn. Ngay cả đối với các ứng dụng đơn giản, danh sách ngày càng tăng của quy tắc có thể nhanh chóng trở thành quá phức tạp.

2. Dịch vụ NLP Cloud-Based

Trong vài năm qua, một loạt các dịch vụ xử lý ngôn ngữ tự nhiên (NLP) dựa trên nền tảng đám mây đã nổi lên với mục đích làm giảm sự phức tạp liên quan đến việc hiểu được ngôn ngữ tự nhiên. Những dịch vụ này được dự định để cho phép các nhà phát triển mà không cần quan tâm tới học máy hoặc chuyên môn về NLP có thể tạo ra các sản phẩm hữu ích. Những dịch vụ này thường được cung cấp bởi các công ty Internet lớn để lôi kéo các nhà phát triển tải dữ liệu huấn luyện của họ lên và qua đó giúp các nhà cung cấp dịch vụ cải tiến AI giao tiếp riêng của họ. Trong số các dịch vụ NLP hiện có là Amazon Lex , api.ai của Google , wit.ai của Facebook , Microsoft LUIS , Viv của Samsung , và IBM Watson conversation.

3. Machine Learning Toolkits

Các bộ công cụ phổ biến bao gồm Google’s TensorFlow, Microsoft Cognitive Toolkit, and Apple’s GraphLab Create. Những bộ công cụ này hỗ trợ xử lý NLP ở mức chuyên sâu hơn. Người ta bảo sâu quá đến mức ngay cả những kỹ sư học máy giỏi nhất hiếm khi thành công trong việc xây dựng các ứng dụng đàm thoại chất lượng sản xuất sử dụng bộ công cụ học máy hiện nay.

4. AI Conversational platform

Ví dụ Mindmeld https://www.mindmeld.com.

II. Các bước tương tác của một ứng dụng Conversational AI

1. Wake-up word detection:

Hay còn gọi là keyword spotting. Khi ứng dụng ở trạng thái chờ, nó hoạt động rất ít để không tiêu tốn năng lượng của thiết bị, chỉ có phần lắng nghe hành động từ người dùng là đang chạy. Phần này có chức năng phát hiện ra các từ ví dụ như “Hey siri” “Hey Cortana” “Ok Google”,... sau đó các thành phần còn lại của ứng dụng bắt đầu được kích hoạt.

2. Speech recognition: (speed-to-text, ARS)

Chuyển đổi tiếng nói thành văn bản.

3. Domain classification:

Phân loại miền (domain), đây là bước đầu tiên của xử lý ngôn ngữ tự nhiên (NLP), nó sẽ phân tích văn bản từ ARS và xếp loại mỗi yêu cầu thành 1 tập các miền được định nghĩa trước. Ví dụ đầu vào là “will it rain tomorrow?” thì nó có domain là “weather”, “Play my sad songs list” thì có domain là “music”.

4. Intent classification:

Đây là bước thứ 2 của NLP, có nhiệm vụ xếp loại mỗi đầu vào thành 1 tập các mục tiêu (intent) được định nghĩa sẵn. Mỗi intent phản ánh những gì người dùng đang cố gắng thực hiện, nó quy định 1 hành động được mô tả rõ ràng, hoặc 1 loại phản hồi mà được định nghĩa sẵn để trả lời cho mỗi yêu cầu. Ví dụ “wake me up at 7am” thì itent là “set-alarm”, “who sing that song?” thì itent là “get-artist”,...

5. Entity recognition:

Đây là bước thứ 3 của NLP, nhận dạng thực thể (entity). Thành phần này được giao trách nhiệm phát hiện các từ và cụm từ quan trọng đối với mỗi yêu cầu. Ví dụ có 1 yêu cầu là “Play Vogue by Madona”, thì “Vogue” là entity xác định tên bài hát, “Madona” là entity xác định ca sỹ.

6. Role classification:

Bước thứ 4 của NLP, có nhiệm vụ phân loại / gán nhãn vai trò (role). Ví dụ có yêu cầu là “Book a flights from A to B”, entity A sẽ có nhãn là “origin”, còn entity B có nhãn là “destination”.

7. Entity resolution:

Bước thứ 5 của NLP, bước này sẽ match mỗi thực thể đã được xác định với 1 từ thực tế, loại bỏ sự không chắc chắn từ khái niệm hoặc đối tượng. Ví dụ, entity “Trump” có thể được xử lý thành “President Donal Trump”.

8. Language parsing:

Bước cuối cùng của NLP. Bước này có thể bao gồm cả phân tích cú pháp phụ thuộc và phân tích ngữ nghĩa. Nó có trách nhiệm xác định các mối quan hệ giữa các cá nhân thực thể đã được xác định trong mỗi yêu cầu.

9. Question answering:

Bước này xác định câu trả lời tốt nhất dành cho mỗi yêu cầu. Để làm được việc này thì nó cần dựa trên nền tảng kiến thức, ví dụ như danh sách catalog hay dữ liệu sản phẩm (đối với ứng dụng trả lời tự động cho 1 cửa hàng nào đó), nó sẽ kiểm tra tính hợp lệ của mỗi câu trả lời đưa ra và cung cấp các khuyến nghị và đề xuất.

10. Language generation:

Diễn giải đầu ra của các thành phần NLP và các câu trả lời thành 1 phản hồi bằng ngôn ngữ của con người cho mỗi yêu cầu. Phản ứng này được thiết kế để trông giống như một sự tương tác ngôn ngữ tự nhiên trong thế giới thực.

11. Dialogue management:

Quản lý đối thoại theo dõi bối cảnh của cuộc hội thoại trên nhiều tương tác và đưa ra các phản hồi thích hợp trở lại cho người sử dụng ở từng giai đoạn của cuộc đàm thoại. phản ứng bao gồm việc trả lời bằng ngôn ngữ tự nhiên cũng như các yếu tố tương tác khác.

12. Speech synthesis:

Tổng hợp giọng nói chuyển đổi từ phản hồi bằng ngôn ngữ tự nhiên dựa trên văn bản thành âm thanh nói có thể được đọc to cho người sử dụng nghe thấy.

Cần những bước nào

  • Ví dụ, khi bạn xây dựng một trợ lý trò chuyện cho một nền tảng tin nhắn như Facebook Messenger, đầu vào và đầu ra là văn bản chứ không phải là giọng nói. Trong trường hợp này, các bước 1, 2, và 12 là không cần thiết.

  • Khi xây dựng một ứng dụng mà chỉ thực hiện những hành động đơn giản và không cần trả lời những câu hỏi phức tạp, thì Bước 9 có thể không cần thiết.

  • Nếu bạn muốn xây dựng một trợ lý giọng nói mà có cùng một mức độ chính xác và tính linh hoạt như các sản phẩm như Siri, Alexa (trợ lý ảo của Amazon) và Cortana, cần yêu cầu tất cả 12 bước xác định ở trên.

III. Tensorflow

1. Là gì?

TensorFlow là 1 library do Google phát triển và opensource vào tháng 11/2015. TensorFlow được cho là sử dụng trong nhiều service của Google:

  • phân loại email của Gmail,

  • nhận biết phát âm và dịch tự động,

  • nhận biết khuôn mặt trong Google Photo,

  • tối ưu hoá kết quả tìm kiếm,

  • quảng cáo trong Youtube.

Đặc trưng của TensorFlow là xử lý được tất cả các loại dữ liệu có thể biểu diễn dưới dạng data flow graph hay low level như xử lý chữ viết tay.

TensorFlow được viết bằng C++, thao tác interface bằng Python vì thế performance rất tốt, dùng được cả CPU lẫn GPU nên TF có thể chạy trên cả PC thông thường lẫn 1 server cực lớn, thậm chí cả smartphone cũng có thể sử dụng được.

2. Cài đặt

  • Trên windows cần cài Python 3.5.x (chỉ hỗ trợ python này trên windows), sau đó chạy
pip3 install --upgrade tensorflow #TensorFlow with CPU support only

hoặc

pip3 install --upgrade tensorflow-gpu #TensorFlow with GPU support

xem thêm tại [Installing TensorFlow on Windows](https://www.tensorflow.org/install/install_windows)

3. Các khái niệm cơ bản

Tensor

  • Tensor là khái niệm cơ bản nhất trong TensorFlow.

  • Tensor là cấu trúc dữ liệu được sử dụng trong toàn TensorFlow, đại diện cho tất cả các loại dữ liệu. Hay nói cách khác là tất cả các loại dữ liệu đều là tensor.

  • Việc trao đổi dữ liệu trong quá trình xử lý chỉ thông qua tensor.

  • Hiểu đơn giản thì tensor là mảng n chiều hay list cộng thêm 1 số thứ khác.

  • Tensor có 3 thuộc tính là Rank, Shape, Type.

Biểu đồ tính toán

Biểu đồ tính toán (là một loạt các phép toán TensorFlow sắp xếp thành một biểu đồ của các nút)

chương trình TensorFlow Core như là hai phần rời rạc:

  • Xây dựng biểu đồ tính toán

  • Chạy biểu đồ tính toán

Ví dụ ta có phép tính và bên cạnh là Tensorboard

Rank

t = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] #Rank 2

Rank là số chiều của dữ liệu.

Shape

t = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] #Shape là [3, 3]
t = [[[2], [4], [6]], [[8], [10], [12]], [[14], [16], [18]]] #Shape là [1, 3, 3]

Shape là chiều của tensor.

Type

Là các dạng số trong Tensorflow

Ngoài ra còn có const, variable,... thì cũng giống các ngôn ngữ lập trình khác.

tf.train API

Tensorflow có rất nhiều api, nhưng trước hết là tìm hiểu về tf.train này đã.

Ta có:

import numpy as np
import tensorflow as tf
# Model parameters
W = tf.Variable([.3], tf.float32)
b = tf.Variable([-.3], tf.float32)
# Model input and output
x = tf.placeholder(tf.float32)
linear_model = W * x + b
y = tf.placeholder(tf.float32)
# loss
loss = tf.reduce_sum(tf.square(linear_model - y)) # sum of the squares
# optimizer
optimizer = tf.train.GradientDescentOptimizer(0.01)
train = optimizer.minimize(loss)
# training data
x_train = [1,2,3,4]
y_train = [0,-1,-2,-3]
# training loop
init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init) # reset values to wrong
for i in range(1000):
sess.run(train, {x:x_train, y:y_train})
# evaluate training accuracy
curr_W, curr_b, curr_loss  = sess.run([W, b, loss], {x:x_train, y:y_train})
print("W: %s b: %s loss: %s"%(curr_W, curr_b, curr_loss))

Giải thích:

  • W: trọng số (weights)

  • b: bias

  • linear_model: hàm số gần nhất thoả mãn bộ dữ liệu (dữ liệu đầu vào và kết quả thực tế cho trước)

  • [x, y] cặp dữ liệu đầu vào và kết quả

  • loss: Hàm mất mát trả về một số thực không âm thể hiện sự chênh lệch giữa hai đại lượng: y’ được dự đoán và y đúng. Trong trường hợp lý tưởng, tức là khi y’ = y, hàm mất mát sẽ trả về giá trị cực tiểu, bằng 0.

  • TensorFlow cung cấp các trình tối ưu hóa mà từ từ thay đổi từng biến đã cho để giảm thiểu mất mát. Trình tối ưu hóa đơn giản nhất là `gradient descent`.

Tức là thế này, đây là quá trình training 1 mô hình (1 hàm số) bằng các giá trị đầu vào có sẵn và đầu ra có sẵn tương ứng:

  • Tính giá trị output .

  • So sánh output với giá trị mong muốn (đầu ra có sẵn tương ứng với đầu vào).

  • Nếu chưa đạt được giá trị mong muốn (hàm loss chưa đạt được giá trị tối thiêu) thì hiệu chỉnh trọng số (W) và tính lại output.

Theo ví dụ ở trên, sau khi ta chạy thì sẽ được kết quả:

W: [-0.9999969] b: [ 0.99999082] loss: 5.69997e-11

4. Recurrent Neural Networks

Trước hết cần tìm hiểu [Neural Networks](https://www.google.com.vn/search?q=neural+networks)

RNN là gì?

  • Ý tưởng của RNN đó là thiết kế một Neural Network sao cho có khả năng xử lý được thông tin dạng chuỗi (sequential information), ví dụ một câu là một chuỗi gồm nhiều từ.

  • RNN tạo ra các mạng vòng lặp bên trong chúng, cho phép thông tin được lưu trữ lại cho các lần phân tích tiếp theo.

  • Recurrent có nghĩa là thực hiện lặp lại cùng một tác vụ cho mỗi thành phần trong chuỗi. Trong đó, kết quả đầu ra tại thời điểm hiện tại phụ thuộc vào kết quả tính toán của các thành phần ở những thời điểm trước đó.

  • Trong biểu đồ trên, A nhận thông tin của x_t tại thời điểm t và phản hồi lại tương ứng kết quả đầu ra h_t tại thời điểm t.

Nói cách khác, RNNs là một mô hình có trí nhớ (memory), có khả năng nhớ được thông tin đã tính toán trước đó. Không như các mô hình Neural Network truyền thống đó là thông tin đầu vào (input) hoàn toàn độc lập với thông tin đầu ra (output). Về lý thuyết, RNNs có thể nhớ được thông tin của chuỗi có chiều dài bất kì, nhưng trong thực tế mô hình này chỉ nhớ được thông tin ở vài bước trước đó.

Trong TF, để sử dụng RNN ta có thể làm theo ví dụ như sau:

lstm = tf.contrib.rnn.BasicLSTMCell(lstm_size)
# Initial state of the LSTM memory.
state = tf.zeros([batch_size, lstm.state_size])
probabilities = []
loss = 0.0
for current_batch_of_words in words_in_dataset:
# The value of state is updated after processing each batch of words.

output, state = lstm(current_batch_of_words, state)

# The LSTM output can be used to make next word predictions

logits = tf.matmul(output, softmax_w) + softmax_b

probabilities.append(tf.nn.softmax(logits))

loss += loss_function(probabilities, target_words)

Tại sao lại là BasicLSTMCell thì ta cần tìm hiểu thêm về [Vấn đề phụ thuộc quá dài](https://www.google.com.vn/search?q=Long-Term+Dependencies

5. Sequence-to-Sequence Models

RNN có thể được sử dụng như là mô hình ngôn ngữ cho việc dự đoán các phần tử của một chuỗi khi cho bởi các phần tử trước đó của một chuỗi. Tuy nhiên, chúng ta vẫn còn thiếu các thành phần cần thiết cho việc xây dựng các mô hình đối thoại, hay các mô hình máy dịch, bởi vì chúng ta chỉ có thể thao tác trên một chuỗi đơn, trong khi việc dịch hoạt động trên cả hai chuỗi – chuỗi đầu vào và chuỗi được dịch sang.

Các mô hình chuỗi sang chuỗi được xây dựng bên trên mô hình ngôn ngữ bằng việc thêm vào một bộ mã hóa Encoder và một bộ giải mã Decoder.

  • Bao gồm hai mạng RNN: Một cho bộ mã hóa, và một cho bộ giải mã.

  • Bộ mã hóa nhận một chuỗi (câu) đầu vào và xử lý một phần tử (từ trong câu) tại mỗi bước.

  • Mục tiêu của nó là chuyển đổi một chuỗi các phần tử vào một vectơ đặc trưng có kích thước cố định mà nó chỉ mã hóa thông tin quan trọng trong chuỗi và bỏ qua các thông tin không cần thiết.

Sử dụng trong TF:

outputs, states = basic_rnn_seq2seq(encoder_inputs, decoder_inputs, cell)

6. Ứng dụng demo

Nói lan man từ nãy tới giờ, thì chốt lại vấn đề là ta đang dùng Tensorflow để xây dựng 1 ứng dụng giao tiếp, trong đó dùng train api của TF để "dạy" nó và dùng seq2seq api để tạo ra cách mà nó trả lời câu hỏi đưa ra.

Clone app từ [Deep Q&A](https://github.com/Conchylicultor/DeepQA

git clone https://github.com/Conchylicultor/DeepQA.git

Cài đặt những thứ cần thiết

Yêu cầu

* python 3.5

sudo apt-get update
sudo apt-get install python3

* tensorflow

pip3 install tensorflow
#hoặc
pip3 install tensorflow-gpu

* numpy

pip3 install numpy

* CUDA (nếu dùng bản TF với GPU) (cài đặt https://askubuntu.com/questions/799184/how-can-i-install-cuda-on-ubuntu-16-04)

* nltk (natural language toolkit for tokenized the sentences)

pip3 install nltk

* tqdm (progression bars lúc mình training)

pip3 install tqdm

Download additional data để chạy nltk.

python3 -m nltk.downloader punkt

Sử dụng Cornell dataset để training Model của chúng ta, đây là 1 tập hợp các câu đối thoại trong phim mà ngta đã tổng hợp lại.

Nếu muốn chạy nó giống như 1 ứng dụng web thì cần cài thêm vài thứ nữa:

* django (1.10)

pip3 install django

* channels

pip3 install channels

* Redis

sudo apt install redis-server

* asgi_redis (1.0 trở lên)

pip3 install asgi_redis

Bắt đầu chạy

  • Để training model, chạy lệnh
python main.py

sau đó thời gian chờ đợi khá là lâu và còn phụ thuộc vào máy tính có đủ mạnh hay không.

chi tiết có tại đây https://github.com/Conchylicultor/DeepQA#chatbot

python main.py --test interactive

và bắt đầu nói chuyện

results matching ""

    No results matching ""