Wolfram alpha - Sự đột phá về giải thuật, tri thức cơ bản và công nghệ trí tuệ nhân tạo

Mở đầu

Trước mình học một khóa Machine Learning Fundamental trên công ty. Khi thầy bảo tính đạo hàm (để dùng cho gradient descent). Mọi người bắt đầu tính. Mình thì tra bảng đạo hàm cơ bản. Còn một chị trong lớp thì bảo dùng **Wolfram Alpha. **Lúc đó mình không biết đó là cái gì. Còn chả biết viết như nào :D. Chỉ mơ hồ đoán nó là một công cụ tính toán gì đó rất mạnh còn giải được hệ phương trình. Tính đạo hàm các thứ… Chắc có nhiều bạn đã biết, đối với mình thì nó mới. Nay tình cờ mình lại đọc được về nó. Mục đích bài viết là để giới thiệu từ khóa wolfram alpha.

Compute expert-level answers using Wolfram’s breakthroughalgorithms, knowledgebase and AI technology

Wolfram Alpha là gì

Thử hỏi nó xem nó tên gì, bao nhiêu tuổi và hoạt động thế nào.

Input interpretation:

How old is Wolfram|Alpha?

Response:

9 years 6 months 23.13 days (right now)

Nó đã được 9 năm. Các bài viết về nó toàn từ hồi 2009.

Input interpretation:

What's inside Wolfram|Alpha?

Result:

Wolfram|Alpha is powered by the Wolfram Language

Ok nó được làm bằng thứ gì đó gọi là Wolfram Language.

Hỏi xem nó biết gì về albert einstein không?

Các lĩnh vực wolfram alpha

Chúng ta xem toán học có gì. Có vẻ toán học là cái nó mạnh nhất hoặc vật lý vì người tạo ra nó là nhà vật lý học. Đạo hàm thử xem có như lời đồn không.

Wolfram Language

Wolfram language là ngôn ngữ máy tính (computer language). Nó cho bạn cách để giao tiếp với máy tính. Cụ thể là bạn nói cho nó biết cái mà nó làm. Có rất nhiều ngôn ngữ máy tính như C++, Java, Python và Javascript. Wolfram language là độc nhất với hiểu biết cơ bản của nó (knowledge based). Nghĩa là nó đã biết nhiều rồi, bạn cần phải nói cho nó ít nhiều cái bạn muốn. Bạn có thể làm mọi thứ trực quan, tương tác, nhiều thứ khác. Bạn có thể phân tích, mô phỏng các thứ. Bạn có thể tạo ứng dụng, chương trình và các website. Bạn có thể lên ý tưởng và implement chúng trên máy tính, điện thoại, các thiết bị nhúng nhỏ và nhiều hơn nữa. Wolfram language được xây dựng hơn 30 năm từ Mathematica được sử dụng rộng rãi trong nghiên cứu.

Thực hành sử dụng Wolfram Language

Cách tốt nhất đề học Wolfram Language là sử dụng nó. Wolfram Programming Lab dễ dàng truy cập và học ngôn ngữ này, hoặc bạn có thể sử dụng các môi trường tương tác Wolfram Language khác (chắc có cái IDE nào đó không rõ).

Tác giả

Copy từ https://dongtac.hncity.org/?Co-quy-tac-de-hieu-moi-the-gioi-thuc-tai-1 Wolfram là người Anh gốc Do Thái, sinh 1959 tại London. Ông cho rằng mọi hiện tượng trong vạn vật từ vũ trụ đến thị trường chứng khoán đều có thể quy về những chương trình tin học đơn giản và mọi hiện tượng phức tạp đều là kết quả phát triển của những tế bào ban đầu gọi là các tế bào autômát (viết tắt là CA - cellular automaton). Stephen Wolfram là một thần đồng có công trình khoa học từ khi 16 tuổi, nghiên cứu vật lý các hạt cơ bản, vũ trụ, toán học, tin học,… tác giả của Mathematica (hình 1), một phần mềm toán học tượng trưng nổi tiếng được sử dụng trên toàn thế giới. Wolfram sáng lập tập đoàn phần mềm hàng đầu Wolfram Research, Inc. có trên 2 triệu người sử dụng Mathematica. Các phiên bản mới của Mathematica liên tục bảo đảm cuộc sống của hơn 300 người trong công ty Wolfram Research, Inc. Wolfram nhiều năm suy nghĩ về một câu hỏi lớn: mọi cấu trúc phức tạp và đa dạng trong thế giới thực tại đã hình thành như thế nào? Liệu thiên nhiên có sử dụng một số quy tắc nào trong khi sáng tạo ra mọi vật, liệu có một khoa học lý thuyết nào để mô tả những quy tắc này? Trong thời gian sau này Wolfram rời quản lý công ty để chuyên nghiên cứu về CA và năm 2002 công bố cuốn sách Một loại hình khoa học mới [1] dày 1280 trang, rất sớm trở thành hiện tượng trong giới khoa học (hình 2). Khi nói đến cuốn sách này người ta không thể không nói đến phần mềm Mathematica, cơ sở tính toán cho NKS [2]. Wolfram tin rằng tồn tại một chương trình rất đơn giản, được chạy trong một thời gian rất dài và dẫn đến mọi sự phức tạp trong vũ trụ: các sao, mặt trời, khí hậu, các sinh vật, các dòng chảy của chất lỏng, thị trường chứng khoán… Và chương trình đó chính là lý thuyết tối hậu của vật lý.

Ý kiến khác

Cũng có những bài viết, bình luận về wolfram alpha. Copy từ đây. Wolfram Alpha không phải là một cỗ máy tìm kiếm thông thường. Nó chiếm không gian ở giữa Google và Wikipedia nên sự thành công của Wolfram Alpha là một điều rất đáng nghi ngờ. Tuy nhiên, nếu bạn cần một câu trả lời ngắn gọn (với điều kiện Wolfram Alpha có thể hiểu được câu hỏi) thì đây là một công cụ hữu ích. Darien Graham – Smith (website PC Pro): “Wolfram Alpha sẽ tốt nếu bạn là một nhà nghiên cứu và cần những số liệu thống kê. Nó có rất ít tác dụng với những người khác, ít nhất là cho đến thời điểm này” - simonbarker *(Phóng viên công nghệ - Mỹ). “Tồi tệ khủng khiếp! Hầu như nó chẳng hiểu bất cứ một lệnh tìm kiếm nào” - *GwangjuSam “Wolfram Alpha = rác, liệu đến phiên bản tới có tốt hơn không?”- dpoyser.

Kết thúc

Mình cảm thấy wolfram alpha rất tuyệt vời. Bản thân mình rất muốn có thể làm được một hệ thống như vậy (mình nói muốn nhé, còn mình là một thằng vớ vẩn). Một con trợ lý hiểu biết tất cả. Wolfram alpha còn có phần dành cho nhà phát triển call api. Quá tuyệt vời phải không làm được một ứng dụng giải toán. Tra cứu nhanh mọi thứ. Cám ơn các bạn.

Giới thiệu pre calculus - Sách Pre calculus workbook for Dummies

Có thể bạn đi sau, đi chậm hơn bạn bè nhưng không sao cả, quan trọng là cái đích bạn hướng tới. Can đảm lên bạn nhé

Mở đầu

Kiến thức căn bản toán của mình đã rơi rụng gần hết. Và trước giờ mình cũng không đọc tài liệu tiếng anh. Đây sẽ là thời điểm mà mình phải ôn lại một cách nghiêm túc. Để bắt đầu chúng ta cùng học cuốn pre calculus workbook for dummies. Chúng ta đi từ đơn giản trước không nặng về toán để làm quen dần và các thuật ngữ tiếng anh. Chúng ta quay lại điểm bắt đầu của bắt đầu. Việc vừa học vừa viết lại thế này sẽ rất lâu nhưng sẽ nhớ lâu hơn.

Pre calculus workbook for Dummies

  • Introduction
  • Part I: Foundation (And We Don’t Mean Makeup!)
  • Part II: Trig Is the Key: Basic Review, the Unit Circle, and Graphs
  • Part III: Advanced Trig: Identities, Theorems, and Applications
  • Part IV: And the Rest
  • Part V: The Part of Tens

Về quyển sách này.

Đừng để pre-cal làm bạn sợ. Khi bạn nhận ra rằng bạn đã biết tất cả chỉ là Đại số I và II (Algebra), bạn sẽ nhìn thấy rằng pre-cal là thực sự chỉ sử dụng các thông tin cũ theo cách mới. Và mặc dù nếu bạn đã sợ, chúng tôi ở đây với bạn, vì thế không cần hoảng loạn. Trước khi bạn sẵn sàng để bắt đầu một cuộc phiêu lưu mới, bạn cần biết một vài thứ về cuốn sách này. Cuốn sách không phải là tiểu thuyết. Nó không có nghĩa là đọc từ đầu tới cuối. Bạn có thể đọc từ bất kỳ chủ đề nào ở bất kỳ thời điểm nào, nhưng chúng tôi đã cấu chúng theo cách mà đi theo chương trình giáo dục bình thường. Điều này là khó để làm bởi vì một vài vùng không có pre-calc. Chúng ta sẽ xem chương trình giảng dạy, và sẽ trình bày như một khóa học. Thỉnh thoảng, chúng tôi có thể liên kết phần toán trong các chương khác và chúng tôi gửi cho bạn rất nhiều thông tin. Thay vì đặt cuốn sách trên giá và không bao giờ nhìn lại nó, hãy sử dụng nó như một cái chặn cửa. Chúng tôi gợi ý bạn đi theo một trong hai cách:

  • Tìm kiếm cái bạn cần để biết khi bạn cần tới nó.
  • Bắt đầu từ đầu và đọc xuyên suốt. Theo cách này bạn sẽ được nhắc lại các chủ đề cũ mà đã quên (bất cứ thứ gì về toán trong đầu bạn). Bên cạnh đó hãy thực hành cho tốt.

Lời giả sử khờ dại

Chúng tôi không mong rằng bạn yêu toán theo cách mà chúng tôi làm như một chuyên gia (professional math geeks). Chúng tôi giả sử rằng bạn đã chọn quyển sách này vì lý do riêng của bạn. Có lẽ bạn muốn xem qua về một khóa học trước khi bạn lấy nó, hoặc có lẽ bạn cần phải khởi động lại chủ đề trong khóa học này, hoặc có lẽ con bạn đang học khóa này và bạn cần cố gắng đề giúp cậu bé thành công. Dù gì đi nữa, chúng tôi giả sử bạn đã gặp phải các chủ đề này trước đây, bởi nó là các phần thông dụng, các chủ đề sẽ được xem lại một lượt và bạn sẽ gặp lại trong Đại số và Hình học(algebra or geometry).

Cách tổ chứng của sách

Cuốn sách này được chia thành năm phần, trình bày các chủ đề được dạy trong môn pre-calc. Phần 1: Khởi đầu. Trong các chương của phần I, khởi đầu của khởi đầu. Trước hết chúng tôi sẽ ôn lại các khái niệm ở môn Đại số II. Chúng tôi sẽ bao gồm các số thực và cái mà bạn được hỏi để làm việc với chúng. Tiếp theo là các loại functions (polynomials, rational, exponential, and logarithmic) Bậc cao, mũ và logarit. Các dạng đồ thị của chúng và performing operations với chúng Phần 2: Trig 1s the key (không dịch được): Basic review the Unit Circle và đồ thị Đến phần đọc chương hai mình sẽ có vốn đề dịch lại phần này.

Kết thúc

Cám ơn các bạn đã theo dõi!

Text to speech - chuyển văn bản thành giọng nói

Mở đầu

Bài viết không liên quan tới machine learning. Chúng ta sẽ gọi api của fpt. Thằng bạn mình hỏi học machine learning có làm được chuyển văn bản thành giọng nói không. Mình bảo là không (vì mình không biết thật). Nhưng sau khi thấy nó nghe truyện mạng với chị google (bản thân mình không có hứng thú với truyện ngôn tình hay kiếm hiệp và có thì chắc mình cũng đọc chữ) thì mình nghĩ kiếm cho nó cái api nào cho nó dùng. Nó có bảo mình phải tạo model machine learning đâu. Ở bài viết này mình sẽ hướng dẫn cho các bạn tạo app text to speech. Có luôn source code để các bạn tải về dùng miễn phí hoàn toàn. Các bạn có thể dùng để nghe truyện, đọc báo hoặc tạo giọng nói cho nhà thông minh, chatbot của bạn chẳng hạn rất tiện phải không. Đây là một đoạn của google translate [audio mp3=”http://35.196.17.90/blog/wp-content/uploads/2018/12/translate_tts.mp3"\]\[/audio\] Đây là api fpt [audio mp3=”http://35.196.17.90/blog/wp-content/uploads/2018/12/full.mp3"\]\[/audio\] Đây là phần giới thiệu của fpt Tổng hợp tiếng nói (Speech synthesis) là bài toán cơ bản trong bài toán lớn về giao tiếp giữa người và máy (Human-Machine Interface). Với tham vọng riêng của mình, Ban công nghệ FPT (FTI) đã nỗ lực nghiên cứu suốt gần 5 năm qua để cho ra mắt sản phẩm FPT Speech Synthesis. Sản phẩm là sự kết hợp của:

  • Ngôn ngữ học (Linguistics): âm vị học (Phonology), hình thái học (Morphology), ngữ dụng học (Pragmatics)
  • Vật lý học: âm học
  • Công nghệ: Xử lý ngôn ngữ tự nhiên (Natural Language Processing) , học máy (Machine Learning), xử lý tín hiệu số (Digital Signal Processing)

Được đánh giá là hệ thống tổng hợp tiếng nói tiếng Việt có chất lượng tốt nhất thị trường hiện nay, hệ thống tổng hợp tiếng Việt mới của FPT đang được mở trên Open FPT (http://openfpt.vn/). Các nhà phát triển có thể khai thác nguồn tài nguyên này để xây dựng ứng dụng của riêng mình trên các nền tảng khác nhau. Cho đến thời điểm này, đã có nhiều sản phẩm như “Giao thông thông minh” do FPT IS phát triển, hệ thống thông báo thông tin tài chính của VHT, hệ thống sinh ra video tự động từ bái báo điện tử, … đang sử dụng Speech Synthesis API của Open FPT và nhận được rất nhiều phản hồi tích cực từ người dùng.

Text to speech

Mình viết bằng python. Đầu tiên ta cần vào https://dev.openfpt.vn/ đăng ký tài khoản và tạo key để dùng cho app. Ok có cả phần test luôn. Các bạn có thể thử để xem chất lượng giọng nói. Tài liệu ở đây. Chúng ta bắt đầu code.

Khởi tạo các tham số

Keys xin phép được ẩn đi. Mình chẳng tiếc nhưng sợ đông người dùng các bạn làm chậm của nhau. May cho chúng ta có phần comment của thằng bạn mình. Source code ở phía cuối bài viết, mình cũng lười không làm cái ứng dụng giao diện tử tế. Quan trọng là ý tưởng phải không :D. Chúng ta dùng nhiều key bởi vì fpt sẽ chặn số lượng request tính trên phút. Mình sẽ thay đổi liên tục các keys để lack vụ này :D.

import sys
import requests

#API Key của bạn
keys = [
‘#############################’,
‘#############################’,
‘#############################’,
‘#############################’
]

#Xác định các giọng đọc, voice có các giá trị là leminh (giọng nam miền bắc), male (giọng nam miền bắc),

#female (giọng nữ miền bắc), hatieumai (giọng nữ miền nam), ngoclam (giọng nữ Huế)
voice = “leminh”
# Xác định các giọng đọc, voice có các giá trị là:
# leminh (giọng nam miền bắc nghe ấm ),
# male (giọng nam miền bắc hơi già có tiếng thở),
# female (giọng nữ miền bắc trẻ, giọng trong đọc hơi chậm so với các giọng khác),
# hatieumai (giọng nữ miền nam nghe đk),
# ngoclam (giọng nữ Huế đọc hơi bị ngắt nên cho chậm lại)
speed= “0”

#ngữ điệu 1 on. 0 off
prosody= “0”

#phần dưới này để phục vụ cho việc nhận tham số từ cmd khi sử dụng file start.py
# vd call file “start.py input” #input là input.txt lưu văn bản cần chuyển thành giọng nói
# hoặc chỉnh sửa short_direct đối với dùng jupyter notebook
# ngoài cách chạy command line có thể sử dụng jupyter notebook chủ yếu cho người phát triển
args = sys.argv
if len(args) >= 1:
short_direct = args[1]
direc = ‘{}/‘.format(args[1])

# Thay ten file
short_direct = ‘starttq’
direc = f’{short_direct}/‘

Backup file mp3 trước đó

Mục đích tránh ghi đè mất file mp3 ở đợt trước

import os
import datetime

#backup file full.mp3
if short_direct not in os.listdir():
os.mkdir(short_direct)
if ‘full.mp3’ in os.listdir(‘{}’.format(direc)):

#create folder backup if not exists
if 'backup' not in os.listdir('{}'.format(direc)):
    os.mkdir('{}backup'.format(direc))

now = str(datetime.datetime.now()).replace(" ", "_").replace(":", "_")
os.rename("{}full.mp3".format(direc), "{}backup/{}.mp3".format(direc, now))
print('backup file full mp3 to {}backup/{}.mp3'.format(direc, now))

# Remove all file mp3
for item in os.listdir(‘{}’.format(direc)):
if item.endswith(“.mp3”):
os.remove(os.path.join(direc, item))
print(‘remove all file mp3’)

Kết quả

Gọi API và tải các file nhạc

Vì fpt giới hạn số lượng ký tự. Nên ta cần cắt ra thành nhiều đoạn. Cắt thế nào để không vào giữa một chữ (phải là “xin chào” chứ không thể cắt “xin ch” rồi file sau là “ào” được). Cách làm đơn giản là lấy 500 (giới hạn của fpt) lùi lại đến khi gặp dấu cách thôi rồi cắt từ đó. Mình để 480 cho chắc :D. Đối với python thì chúng ta có thư viện textwrap.

from textwrap import wrap
import time
import wget
import random
file = open(“{}.txt”.format(short_direct), “r”, encoding=”utf-8”)
content = file.read()

wraptexts = wrap(content, 480)

for i in range(len(wraptexts)):
while True:
try:
text = wraptexts[i]
api_key = random.choice(keys)
print(‘\n’, api_key)
url = “http://api.openfpt.vn/text2speech/v4?api\_key={}&voice={}&speed={}&prosody={}".format(api_key, voice, speed, prosody)
response = requests.post(url, data=text.encode(‘utf-8’), headers={‘voice’:voice, ‘speed’:speed, ‘prosody’:prosody})
response = response.json()
print(‘\n’, response[‘async’]) file = response[‘async’]
print(“downloading file {}/{} “.format(i+1, len(wraptexts)), “{}{:03}.mp3”.format(direc, i))
except :
time.sleep(1)
continue
break
while True:
try:
wget.download(file, “{}{:03}.mp3”.format(direc, i))
except :
time.sleep(0.1)
print(‘Co loi. Thu lai’, end=’’)
continue
break

print(‘\nCOMPLETE’)

Kết quả:

Gộp files

Sau bước trên ta đã tải được các file đơn bây giờ gộp lại. Trên linux thì mình nhớ có sẵn lệnh split và merge file rồi. Trước mình đã thử chia nhỏ ảnh của mình và merge lại vẫn dùng được. Còn trên windows thì không có mình dùng một cái ffmpeg để merge file audios. Còn tải ở đâu thì mình không nhớ, các bạn có thể xem tài liệu https://trac.ffmpeg.org/wiki/Concatenate, hoặc tải 3 file exe ở phần sourcecode.

#create list for merge
import subprocess
f = open(“{}create_list.bat”.format(direc), “w”)
f.write(“(for %%i in (*.mp3) do @echo file ‘%%i’) > list.txt”)
f.close()
s = “{}create_list.bat”.format(direc)
os.chdir(short_direct)
print(os.listdir())
print(s)

# os.system(“create_list2.bat”.format(direc))
subprocess.Popen(“create_list.bat”)
os.chdir(‘..’)

#merge file for create

#output: full.mp3
p = subprocess.run(‘ffmpeg -f concat -safe 0 -i {}list.txt -c copy {}full.mp3’.format(direc, direc))

Vậy là xong. Bạn muốn thưởng thức thì quay lại phần đầu mở audio lên.

Cách sử dụng

Có hai cách:

  • Mở jupyter notebook. Vào cell > Run all nhớ chỉnh short_direct trong code.

  • Dùng cmd: Vào thư mục> start.py starttq. Với starttq.txt là nội dung văn bản.

Kết quả cuối cùng là full.mp3 trong thư mục starttq. Nếu có file full.mp3 sẽ được backup vào thư mục backup.

Kết thúc

Cám ơn các bạn

Hàm liên tục, khả vi, tập xác định, điểm dừng, cực trị, giá trị lớn nhất, nhỏ nhất

Mở đầu

Nhắc lại rằng giá trị lớn nhất và nhỏ nhất (nếu có) của một hàm số f0(x) f0(x) khả vi (và tập xác định là một tập mở) đạt được tại một trong các điểm cực trị của nó. Và điều kiện cần để một điểm là điểm cực trị là đạo hàm của hàm số tại điểm này f′0(x)=0 f0′(x)=0. Chú ý rằng một điểm thoả mãn f′0(x) f0′(x) = 0 thì được gọi là điểm dừng hay stationary point. Điểm cực trị là một điểm dừng nhưng không phải điểm dừng nào cũng là điểm cực trị. Ví dụ hàm f(x)=x3 f(x)=x3 có 0 0 là một điểm dừng nhưng không phải là điểm cực trị.

Mình lấy một đoạn trong blog machinelearningcoban, bản thân mình quên sạch toán, còn không thể định nghĩa hàm, tập xác định, khả vi, điểm dừng cực trị, …. Mình sẽ tìm hiểu và viết trong bài này

Machine Learning hoạt động như thế nào? Thần thoại và sự thật

Mở đầu

Every single computer you know today except Watson is a programmable system. Watson has now launched a third era IBM like to call it cognitive computing. Coginitive systems learn they are not programmed yet, cognitive system are more than machine learning system

Mình tình cờ xem video robot IBM Watson và câu bên trên là một câu được robot nói. Các máy tính ngày nay bạn biết ngoại trừ Watson đều được lập trình tường minh. Watson mở ra một kỷ nguyên mới được gọi là cognitive computing. Cognitive systems học, chúng không phải lập trình, cognitive system nhiều hơn machine learning system. Bài dịch này không nhằm mục đích giới thiệu IBM Watson hay coginitive system (vì mình cũng không biết nó). Bài viết chỉ ra cái nhìn khác, mặt hạn chế của machine learning. Mình không cố giật tít, tiêu đề là mình dịch nguyên gốc.

Machine Learning hoạt động như thế nào? Thần thoại và sự thật

Đáp lại câu hỏi “Machine Learning hoạt động như nào?” Có rất nhiều huyền thoại: rằng nó học một cách tự động, rằng nó không yêu cầu phải tùy biến hay chỉnh sửa bởi các tổ chức sử dụng nó, rằng nó phù hợp với bất kỳ business nào và có thể giải quyết bất kỳ vấn đề nào. Nhưng liệu có đúng như vậy. Giống như bất kỳ công nghệ nào, Machine Learning có tiềm năng về business trong một vài trường hợp, nhưng không phải luôn luôn. Mặc dù được quảng cáo là tạo ra các máy tiếp thị công nghệ cao, nó thường không phải là giải pháp tốt nhất cho việc phân tích thông tin phi cấu trúc. Mặc dù các mà bạn nghe được, nhưng nó không phải ngày hôm này, trong tương lai gần. Đây là sự thật mà (hầu hết) không có ai muốn nói về nó. Như đã giải thích trong bài viết này, machine learning là “một cách khác của việc lập trình máy tính thực thi một tác vụ;” vì thế trước khi hỏi “machine learning làm việc như thế nào?”. Nó rất quan trọng để thiết lập lại kỳ vọng đúng đắn về tiềm năng của machine learning trong business, nhớ rằng nó không phải là thứ phép thuật hay thứ gì đó mới mẻ. Và mặc dù nó gây ấn tượng(hiểu lầm) rằng máy tính có thể nhanh chóng trở nên thông minh (trong hoặc vượt ra ngoài trình độ của loài người, cảm ơn trí tuệ nhân tạo).

Đặc trưng của machine learning (và giới hạn của chúng)

Mặc dù có một số kĩ thuật machine learning, tất cả chúng đều chung phần lõi thống kê. Nói một cách đơn giản (In layman’s terms), Machine learning không nhúng hiểu biết, nó yêu cầu tập tài liệu cho training (một tập tài liệu lớn hơn thì tốt hơn). Tập training phải được đánh dấu thủ công bởi con người vì thế thuật toán có thể ghi lại cái gì có trong tài liệu. Đây là lý do tại sao machine learning không thể tự nó làm mọi thứ… Rất nhiều công việc chân tay sẽ được yêu cầu trong bất kỳ kịch bản nào! Để học hay nhận dạng tài liệu liên quan tới chủ đề, kĩ thuật machine learning phải nuốt vào một số lượng lớn các tài liệu liên quan tới chủ đề đó. Nó cũng phải được gắn thẻ thủ công một lượng lớn tài liệu cái chứa chủ đề và một lớn tương tự không chứa chủ đề đó. Chỉ sau quá trình xử lý nhiều tài liệu đồng thời và tần xuất các từ khóa hệ thống sẽ nhận ra được chủ đề của tài liệu. Độ chính xác của hệ thống đã được train sẽ thay đổi dựa trên số lượng tài liệu được sử dụng trong suốt quá trình train và bao quát các tài liệu này. Hệ thống cũng thường xuyên phải train lại để duy trì chất lượng hệ thống. Sự quá tải thông tin sẽ làm chậm cả hệ thống, trong khi quá khớp (quá nhiều hệ thống cùng thể loại) sẽ khiến cho độ chính xác thấp. Nói cách khác tài liệu sai sẽ là lý do khiến chất lượng giảm Trong một article nổi tiếng, chúng tôi đọc rằng “với machine learning, các kĩ sư không bao giờ biết đúng tuy nhiên máy tính lại hoàn thành được tác vụ của nó”. Neural networks hoạt động mờ mịt và không thể hiểu được, một cách nói khác “black box”. Nghĩa là vấn đề cải thiện bị giới hạn, và nó thường khó để hiểu được tại sao hệ thống lại cải thiện hay làm cách nào bạn cải thiện nó. Trong hệ thống machine learning, đơn giản là không có công cụ nào để với cái để lọc giải thuật. Với machine learning thuần, chỉ một sự lựa chọn bạn có là thử thật nhiều giải thuật khác nhau. Không may, điều này không đảm bảo rằng bạn sẽ cải thiện được kết quả và đạt tới độ chính xác yêu cầu. Nếu có bất kỳ sai lầm nào được phát hiện hoặc hệ thống cần phải sửa đổi vì bất kỳ lý do gì, quá trình lại quay về điểm bắt đầu.

Từ machine learning đến Cognitive AI

Trở lại với câu hỏi đầu tiên của chúng ta “machine learning hoạt động như nào?” Chúng ta có thể nói rằng machine learning hỗ trợ tổ chức khi chúng ta có đủ số lượng tài liệu để train và khi đó chúng ta có một kịch bản đơn giản. Đối với phân tích dữ liệu, ứng cử viên cho thuần machine learning chính xác là cái này: Trường hợp độ phức tạp thấp và tập dữ liệu training lớn với phân phối xác suất của các đầu ra cân bằng. Thay vào đó, khi tình hình mà một lượng nhỏ và không đồng đều các mẫu, độ phức tạp cao, machine learning là không đủ. Cho trường hợp này, bạn cần một linguistic enginem *thứ đủ tinh vi để đảm bảo hiểu sâu vào nội dung và tập công cụ mạnh mẽ đủ để phát triển một ứng dụng *advanced linguistic rules hiệu quả. Tập kĩ thuật Cogito cognitive cung cấp các luật cơ bản về cognitive technology và thuật toán dựa vào machine learning để giải quyết các vấn đề thường gặp về xử lý thông tin phi cấu trúc. Bao gồm phần lớn các kĩ thuật AI nâng cao như machine learning với thuật toán xử lý ngôn ngữ tự nhiên và ngữ nghĩa. Cogito đảm bảo là có hiệu quả cao cho mỗi tình hình. Xem video này để hiểu sự khác biệt giữa Cogito và các công nghệ dựa trên machine learning và Làm thế nào để Cogito tạo ra giá trị cho business của bạn

Kết thúc

Mình đã cố gắng dịch sát nghĩa nhất, một số đoạn mình chưa hiểu lắm. Bạn có thể vào https://www.expertsystem.com/how-does-machine-learning-work/. Bài viết quảng cáo cogito nhưng mình chưa thấy demo nào. Tóm lại machine learning không giải quyết được mọi vấn đề của doanh nghiệp, nó còn có các hạn chế. Ngoài machine learning, AI còn rất rộng còn có một thứ gọi là Cognitive computing. Đối với mình, kĩ thuật nào đều có hạn chế của nó, machine learning cũng vậy, nó không thể giải quyết được mọi vấn đề, không phải là true AI, nhưng nó đã giải quyết được rất nhiều bài toán thực tế. Còn cognitive system như IBM Watson là rất ấn tượng, nhưng có vẻ chưa được rõ ràng và cũng không có nhiều tài liệu nói về nó. Cảm ơn các bạn!

Titanic Data Science Solutions

TBD

Mở đầu

Titanic Data Science Solutions

Tôi đã released một package Speedml, làm cho các kĩ thuật được sử dụng trong notebook này trở nên trực quan, mạnh mẽ và ứng dụng. Speedml giúp tôi nhảy từ dưới 80% trên leaderboard của Kaggle lên trên 20%. Một điều nữa là Speedml làm được điều đó với chỉ 70% dòng code. Tải về và cài đặt Titanic Solution using Speedml. Notebook đi cùng với cuốn sách Data Science Solutions. Notebook này sẽ đi qua các công việc thường làm cho việc giải quyết một cuộc thi Data Science tại Kaggle. Có một vài notebook tuyệt vời để học data science trong các cuộc thi. Tuy nhiên, nhiều khi sẽ bỏ qua một vài giải thích trong việc phát triển giải pháp như là những notebook đó là giành cho chuyên gia với nhau. Nhiệm vụ của notebook này là làm từng bước từng bước, giải thích ở mỗi bước và lý do cho mỗi quyết định chúng ta làm trong việc giải quyết vấn đề.

Các giai đoạn

Một competition solution gồm 7 gia đoạn được mô tả trong Data Science Solutions book.

  1. Đặt câu hỏi hoặc định nghĩa các vấn đề
  2. Thu được training và test data
  3. Chuẩn bị data (Wrangle, prepare, cleanse)
  4. Phân tích, nhận định và khám phá dữ liệu
  5. Mô hình hóa, dự đoán và giải quyết vấn đề
  6. Visualize, báo cáo và biểu diễn vấn đề ở các bước và giải pháp cuối cùng
  7. Supply và Submit kết quả

Bên trên là các bước thường làm. Tuy nhiên có một số trường hợp ngoại lệ.

  • Chúng ta sẽ gộp nhiều giai đoạn. Chúng ta có thể phân tích bằng cách visualizing
  • Thực hiện một giai đoạn nào đó sớm hơn. Chúng ta có thể phân tích data trước khi quá trình wrangling
  • Thực hiện một giai đoạn nhiền lần. Visualize có thể được làm đi làm lại nhiều lần
  • Bỏ một số giai đoạn. Chúng ta có thể không cần Supply(mình chưa hiểu lắm).

Đặt câu hỏi và định nghĩa vấn đề

Các cuộc thi trên Kaggle định nghĩa vấ đề cần phải giải quyết trong khi cung cấp dữ liệu cho việc trainning và test model. Đặt câu hỏi hoặc định nghĩa vấn đề được mô tả ở đây trên Kaggle.

Kết thúc

Phần 4: Deep Learning cho Chatbot - Tạo generative Chatbot

TBD

Mở đầu

Tạo generative Chatbot

Kết thúc

Đến đây nhiều bạn cho rằng là kết quả chẳng được như mong đợi. Có nhiều chatbot framework, thư viện khác để chúng ta tạo ra một chatbot có thể giải quyết được vấn đề của chúng ta, thông báo lịch làm việc, đặt vé máy bay, cái này còn chẳng báo nổi giờ, đã thế thời gian bỏ ra để train model là quá nhiều. Cũng đúng, nhưng với bản thân mình thì mình đã học được rất nhiều, mình phải mất rất nhiều thời gian để có thể sử dụng được tensorflow để implement model này, chưa kể vấn đề generate model, smart chatbot vẫn còn đang nghiên cứu. Có thể nó chẳng được ích lợi gì cho thực tế, nhưng hãy nhìn vào góc độ học tập thì cũng coi như một thành công. Trong bài tiếp theo chúng ta sẽ tìm hiểu cách sử dụng một số thư viện, framework chatbot để ứng dụng thực tế. Tạo một trợ lý riêng. Cám ơn các bạn đã theo dõi bài viết.

Phần 3: Deep Learning cho Chatbot - Thiết kế generative Chatbot

Mở đầu

Ở bài trước chúng ta đã tạo ra một retrieval based Chatbot. Lúc đó mình còn phân vân liệu cái encoder-decoder, seq2seq translate này có phải là retrieval based model hay không. Vì mục đích của mình ban đầu là làm sao cho nó map đúng các câu hội thoại là được. Mình muốn nhắc lại cho các chưa xem các bài viết trước. Retrieval based sẽ đánh giá các câu trả lời có tiềm năng và chọn ra câu tốt nhất để trả lời, không từ mới, không câu mới. Generative model tự sinh ra câu trả lời dựa trên câu yêu cầu. Và mình cũng tìm kiếm các cách tạo ra một generative model nhưng đa phần các bài viết đều nói về mô hình encoder-decoder như mình làm. Cũng có thể gọi là generative vì các câu trả lời được sinh ra đúng theo nghĩa đen tuy rằng nó tối nghĩa. Có nghĩa là chúng ta đang đi đúng hướng. Dẫu chatbot được tạo nó chẳng thông minh tẹo nào, nhưng cũng đươc coi là generative model. Và nó có tệ thế nào đi chăng nữa thì ít nhất chúng ta cũng đã thử. Sự lựa chọn tồi tạo nên những câu chuyện đẹp.

Chatbots với Seq2Seq

Khi Telegram released bot API, cung cấp một cách dễ dàng cho các developers, để tạo ra bots bằng cách tương tác với Bot Father. Ngay lập tức mọi người bắt đầu tạo ra các abstractions (thư viện) cho nodejs, ruby và python, để tạo bot. Chúng ta (Cộng đồng phần mềm tự do) đã tạo ra một nhóm cho việc tương tác với các bot chúng ta đã tạo được. Tôi đã tạo bằng nodejs có thể trả lời bất kỳ truy vấn để trong dấu nháy (dấu nháy ở đây chắc để đánh dấu cho câu cần truy vấn). Chương trình sử dụng linux utility fortune, một pseudorandom message generator. Nó thật ngu ngốc. Nhưng rất vui khi nhìn thấy moi người sẵn sàng tương tác với một chương trình, cái mà đã được tạo ra. Một số người tạo ra Hodor bot. Bạn có thể hình dùng được cái mà nó sẽ làm. Sau khi tôi đã gặp các con bot khác nhau, Mitsuku cái mà khá thông minh. Nó được viết bằng AIML (Artificial Intelligence Markup Language), một ngôn ngữ dạng XML cho phép lập trình viên viết các luật cho bot. Về cơ bản, bạn viết một PATTERN và một TEMPLATE, giống như khi bot nhận được câu khớp với pattern từ người dùng, nó sẽ trả lời với một templates. Chúng ta gọi loại model này là Rule based model. Mô hình dựa theo luật. Rule based model là cách dễ dàng cho bất kỳ ai có thể tạo ra được bot. Nhưng nó là vô cùng khó khăn khi tạo ra một bot có câu trả lời phức tạp. Pattern sẽ khớp với các kiểu đơn giản và kể từ đó AIML sẽ khó khăn khi chúng gặp phải những câu chưa được định nghĩa. Và nó cũng mất nhiều thời gian và công sức để viết các luật bằng tay. Nếu chúng ta có thể tạo ra một bot có thể học từ các cuộc hội thoại giữa con người. Đây là nơi mà Machine Learning có đất dụng võ. Chúng ta sẽ cho model tự học từ data, một model thông minh, Intelligent models có thể chia làm hai loại:

  1. Retrieval-based models
  2. Generative models

Retrieval-based model lấy một câu trả lời trong tập câu trả lời có sẵn. Nó không thể tạo ra bất kỳ câu thoại mới, vì thế chúng ta không cần lo lắng về ngữ pháp. Generate models thông minh hơn. Chúng tạo ra các câu trả lời, word by word. Các câu trả lời được tạo ra có thể có lỗi cú pháp. Những model này khó để train, chúng cũng cần phải học cấu trúc các câu một cách tự động. Tuy nhiên sau khi train, generative model sẽ cho kết quả tốt hơn retrieval-based model trong trường hợp phải xử lý câu mà nó chưa từng gặp và tạp ra một cuộc nói chuyện ấn tượng như con người (có lẽ là trẻ con). Đọc Deep Learning For Chatbots bởi Denny Britz, anh ta nói về length of conversations, open vs closed domain, các thử thách trong generative model như ngữ cảnh, tính cá nhân, hiểu được ý định của người dùng và làm thế nào để đánh giá được model. Chính là các bài viết trước mình đã dịch các bạn có thể tìm đọc lại.

Seq2Seq

Sequence To Sequence model giới thiệu trong Learning Phrase Representations using RNN Encoder-Decoder for Statistical Machine Translation sau đó trở thành model cho Dialogue System (Chatbot) và Machine Translation. Nó bao gồm hai RNNs (Recurrent Neural Network): Một Encoder và một Decoder. Encoder lấy một chuỗi (câu) làm input và xử lý các ký tự (các từ) trong mỗi lần. Nhiệm vụ của nó là chuyển một từ thành các vector có cùng kích cỡ, chỉ bao gồm các thông tin cần thiết và bỏ đi các thông tin cần thiết (có vẻ việc này được thực hiện tự động trong quá trình train). Bạn có thể xem flow. Hình ảnh được mượn từ_ farizrahman4u/seq2seq_ Mỗi hidden state (Một LSTM - một hình vuông trên ảnh đầu vào sẽ là một từ và một hidden state, đầu ra là hidden state và truyền qua LSTM cell tiếp theo) ảnh hưởng tới hidden state tiếp theo và hidden state cuối cùng có thể được nhìn thấy như là tổng kết của chuỗi. State này được gọi là context hoặc thought vector. Từ context (nghĩa là hidden state cuối cùng), the decoder sẽ tạo ra sequence (là câu trả lời được tạo ra), mỗi một từ một lần. Ở mỗi bước decoder sẽ bị ảnh hưởng bởi từ được tạo ra ở bước trước. Hình ảnh được mượn từ_ Deep Learning for Chatbots : Part 1_ Có một vài thử thách khi sử dụng model này. Cái mà phiền nhất là model không thể tự xử lý được chiều dài của câu văn. Nó là một điều phiền phức bởi hầu hết cho các ứng dụng seq2seq. Decoder dùng softmax cho toàn bộ từ vựng, lặp lại với mỗi từ của output. Điều này sẽ làm chậm quá trình train, mặc dù nếu phần cứng của bạn có khả năng xử lý được nó. Việc biểu diễn các từ là rất quan trọng. Bạn biểu diễn từ như thế nào? Sử dụng one-hot vector nghĩa là phải xử lý với vector lớn và one-hot vector không có ý nghĩa cho từ. Chúng ta sẽ phải đối mặt với các thử thách trên, từng cái một.

Padding

Trước train, chúng ta sẽ nhìn vào tập dữ liệu để chuyển chiều dài của các câu cho nó giống nhau bằng cách padding. Chúng ta sẽ sử dụng một vài ký tự đặc biệt để thêm vào câu.

  1. EOS: End of sentence
  2. *PAD: *Filler
  3. *GO: *Start decoding
  4. *UNK: *Từ không có trong từ điển

Các cặp câu query-response như sau:

Q : How are you?
A : I am fine.

Bucketing

Giới thiệu padding đã giải quyết được vấn đề chiều dài của câu. nhưng trường hợp câu quá dài. Nếu câu dài nhất trong dữ liệu là 100, chúng ta encoder tất cả các câu của chúng ta với chiều dài 100, trường hợp này không mất bất kỳ từ nào. Bây giờ, chuyện gì sẽ xảy ra với từ “How are you?” ? Chúng ta có 97 PAD trong encoderd. Điều này sẽ làm mờ đi thông tin thật của cả câu(“How are you”). Bucketing giải quyết được vấn đề này, bằng cách đặt các câu trong các bucket khác kích cỡ. Cân nhắc danh sách sau: [(5, 10), (10, 15), (20, 25), (40, 50)]. Nếu chiều dài câu query là 4 và câu response là 4 chúng ta sẽ đặt vào bucket (5, 10). Query sẽ padded tới 5 ký từ và kết quả là 10. Trong khi run model (khi train và dự đoán), chúng ta sẽ sử dụng một model khác cho mỗi bucket, tương thích với chiều dài của query và response. Tất cả các model sẽ cùng parameter và ví thể function sẽ hoàn toàn giống nhau Nếu chúng ta sử dụng bucket (5, 10). các câu của chúng ta sẽ được encoded như sau:

Q : [ PAD, “?”, “you”, “are”, “How” ]
A : [ GO, “I”, “am”, “fine”, “.”, EOS, PAD, PAD, PAD, PAD ]

Word Embedding

Word Embedding là kĩ thuật cho việc biểu diễn các từ một không gian vector có số chiều thấp. Mỗi từ có thể được nhìn thấy như một điểm trong không gian này, biểu diễn bởi chiều dài cố định. Ngữ nghĩa liên quan giữa các từ cũng được lưu giữ bởi kĩ thuật này. Word vectors có những thuộc tính thú vị:

paris – france + poland = warsaw

khoảng cách giữa paris - france = warsaw - poland Hình ảnh được mượn từ Home Depot Product Search Relevance, Winners’ Interview Word embedding là thường là lớp đầu tiên của mạng: Embedding layer map 1 từ trong từ điển tới một vector cho sẵn kích thước. Trong seq2seq model trọng số của embedding layer được train cùng với các tham số khác của model. Theo chân tutorial này bởi Sebastian Ruder để học về các model kahsc sử dụng word embedding và tầm quan trọng của nó trong NLP. (ok mình thì dùng một word embedding đã được trên từ trước và mình không thay đổi nó, mình không rõ như bên trên có cải thiện nhiều không, chẳng còn cách nào khác chỉ có thể thử thôi :D)

Papers on Sequence to Sequence

  1. Learning Phrase Representations using RNN Encoder-Decoder for Statistical Machine Translation

  2. Sequence to Sequence Learning with Neural Networks

  3. Neural Machine Translation by Jointly Learning to Align and Translate

  4. A Neural Conversational Model

    Phần sau của bài viết này nói đến Attention Mechanism. Mình có xem phần lý thuyết của Attention rồi nhưng mình sẽ học thêm cho vững và trình bày trong một bài khác.

Kết thúc

Bài viết được dịch từ http://complx.me/2016-06-28-easy-seq2seq/ Có rất nhiều thứ cần phải làm ở đây. Chúng ta cứ đi thẳng, đến ngã rẽ tự bản thân sẽ biết đi đường nào. Hẹn gặp lại các bạn trong bài viết tiếp theo. Mình sẽ trình bày về cách tạo Chatbot của mình. Cám ơn các bạn!.

Phần 2: Deep Learning cho Chatbot - Tạo Retrieval-Based Model với Tensorflow

TBD

Mở đầu

Đây là bài dịch tiếp theo. Chúng ta sẽ cùng tạo một retrieval-based Model Chatbot.

Nội dung

Trong bài này chúng ta sẽ implement một retrieval-based bot. Retrieval-based model có một kho định nghĩa trước các câu trả lời chúng có thể sử dụng, không giống như generative models cái mà có thể generate câu trả lời chúng không bao giờ nhìn thấy trước đây. Rõ hơn, từ một câu đầu vào tới retrieval-based model là một context c sẽ chọn ra một câu trả lời response r có khả năng nhất. Ouputs của model là câu trả lời tốt nhất. Để tìm ra câu trả lời tốt nhất bạn cần phải tính toán điểm cho tất cả các câu trả lời và chọn ra một với số điểm cao nhất. Nhưng tại sao chúng ta lại tạo một retrieval-based model nếu chúng ta có thể tạo một generative model? Generative models dường như linh hoạt hơn bnowir vì chúng không cần kho câu trả lời định nghĩa trước, phải không các bạn? Vấn đề là generative models không hoạt động tốt trong thực tế. Ít nhất là cho tới bây giờ. Bởi vì chúng ta có quá nhiều tự do cho việc chúng có thể trả lời như thế nào, generative models có thể tạo ra các lỗi cú pháp, không có nghĩa, không nhất quán. Chúng cũng cần một số lượng dữ liệu training lớn và khó để tối ưu. Đa số hệ thống ngày nay là retrieval-based, hoặc kết hợp giữa retrieval-based và generative. Google’s Smart Reply là một ví dụ. Generative models đang là lĩnh vực active trong nghiên cứu. Nhưng chúng ta không quan trọng, nếu chúng ta tạo một chatbot ngày nay, lựa chọn tốt nhất là tạo một retrieval-based model

The Ubuntu Dialog Corpus

Trong bài viết này chúng ta sẽ sử dụng Ubuntu Dialog Corpus (paper, github). Ubuntu Dialog Corpus (UDC) là một trong những tập dữ liệu hội thoại lớn nhất được public. Nó được dựa trên các lưu trữ chat từ các kênh Ubuntu trên public IRC network (ok là một dạng liên lạc cấp tốc qua mạng gì đó). Paper này sẽ đi vào chi tiết chính xác dữ liệu được tạo như thế nào, vì thế tôi không lặp lại nó ở đây. Tuy nhiên, việc hiểu được dữ liệu là quan trọng khi chúng ta làm việc với chúng, vì thế để tôi giải thích nó trước. Tập dữ liệu training bao gồm 1000000 mẫu, với 50% positive (label 1), 50% negative (label 0). Mỗi vĩ dụ bao gồm context, là điểm bắt đầu hội thoại, và một utterance, một câu phản hồi cho context trên. Positive với label 1 nghĩa là câu phản hồi là thực sự cho context đó, và negative label 0 nghĩa là không phải, Chọn ngẫu nhiên một số mẫu, đây là một vài mẫu dữ liệu. Các dữ liệu được generation script đã được tiền xử lý cho chúng ta (cái này mình không biết là bản thân dữ liệu UDC được tiền xử lý hay là script của bài viết này tiền xử lý, mình sẽ xem thử và trình bày rõ cho các bạn) - Tiền xử lý ở đây là tokenized, stemmed, and lemmatized sử dụng NLTK tool. Script này cũng đã thay thế các entities giống như tên, địa điểm, tổ chức, các url, các đường dẫn hệ thống bằng các ký tự đặc biệt. Việc tiền xử lý này không phải là phải làm, nhưng nó cũng sẽ giúp tăng hiệu quả một vài phần trăm. Trung bình context có 86 từ và utterance có 17 từ. Chúng ta có thể em chi tiết jupyter notebook. Tập dữ liệu còn bao gồm cả tập test sets và validation sets (Ngắn gọn thì đây là 2 tập không để đem đi train mà là tập chưa nhìn thấy để đánh giá model). Định dạng của chúng khác với tập dữ liệu train. Mỗi dữ liệu trong test/validation bao gồm một context, một utterance đúng và 9 utterance sai được gọi là *distractors. *Mục đích của model là gán điểm cao nhất cho đúng utterance, và thấp hơn cho các utterances sai (ok). Có rất nhiều cách để đánh giá model. Cách thường sử dụng là recall@k. *Recall@k *nghĩa là model sẽ chọn ra k câu phản hồi tốt nhất trong 10 câu trả lời có thể (1 đúng và 10 sai). Nếu cái đúng nằm trong những cái mà chúng ta đã đánh dấu thì được coi là đúng (để dễ hiểu chọn k=3 ta chọn ra 3 câu phản hồi tốt nhất nếu trong 3 câu đó mà chứa câu đúng thì được coi là đúng). Vì thế k lớn hơn thì là dễ hơn. Nếu chúng ta set k=10 chúng ta sẽ có recall là 100% bởi vì chúng ta chỉ có 10 câu trả lời. Nếu chúng ta chọn k=1 thì model chỉ có một cơ hội để chọn ra câu trả lời đúng. Ở thời điểm này có lẽ bạn đang tự hỏi là 9 distractors(câu sai) được chọn như thế nào. Trong tập dữ liệu 9 câu sai được lấy ngẫu nhiên. Tuy nhiên trong thực tế bạn có cả triệu khả năng để chọn và bạn không biết được cái nào là đúng. Bạn không thể đánh giá cả triệu câu trả lời để lấy ra một cái có số điểm cao nhất - điều này là quá tốn kém (thời gian đôi khi hệ thống cần trả lời nhanh, ví dụ chatbot gửi câu yêu cầu là cần phản hồi nhanh không thể ngồi đợi đánh giá tất cả rồi chọn câu tốt nhất được, đến đây ta có thể mong ngóng bài viết sẽ đưa ra được mô hình tốt chứ không đơn giản như vậy). Google Smart Reply sử dụng kĩ thuật chia nhỏ các câu trả lời có thể chọn, hoặc nếu bạn chỉ có vài trăm câu trả lời thích hợp trong tất cả bạn có thể đánh giá tất. (Brute force được dùng ở mọi nơi phải không các bạn :D).

Baseline

Trước khi bắt đầu với mạng neural chúng ta hãy thử tạo ra một vài thứ đơn giản để giúp chúng ta có thể hiểu được hiệu quả chúng ta mong muốn. Chúng ta sẽ sử dụng function dưỡi đây để đánh giá recall@k: (Các mã code ở đây mình sẽ copy nguyên si để ta tôn trọng tác giả, mình sẽ implement một cái của riêng mình ở phía cuối cùng chúng ta sẽ cùng làm từ đầu).

def evaluate_recall(y, y_test, k=1):
num_examples = float(len(y))
num_correct = 0
for predictions, label in zip(y, y_test):
if label in predictions[:k]: num_correct += 1
return num_correct/num_examples

Ở đây, y là tập các dự đoán của ta đã được sắp xếp theo điểm giảm dần, và y_test là các nhãn thực sự. Ví dụ y = [0,3,1,2,5,6,4,7,8,9] nghĩa là utteramce số 0 nhận điểm cao nhất, và 9 thấp nhất. Nhớ rằng chúng ta có 10 utterance, với mỗi test example và cái đầu tiên luôn là cái đúng, bởi vì trong dữ liệu test ở trên cột đúng đầu tiên, rồi đến 9 cái sai theo sau. Theo trực giác, nếu chọn một cách ngẫu nhiên ta có kết quả recall@1 là 10%, recall@2 là 20%, …Hãy xem trường hợp dưới đây.

# Random Predictor
def predict_random(context, utterances):
return np.random.choice(len(utterances), 10, replace=False)
# Evaluate Random predictor
y_random = [predict_random(test_df.Context[x], test_df.iloc[x,1:].values) for x in range(len(test_df))]
y_test = np.zeros(len(y_random))
for n in [1, 2, 5, 10]: print(“Recall @ ({}, 10): {:g}”.format(n, evaluate_recall(y_random, y_test, n)))

Kết quả khi lấy ngẫu nhiên.

Recall @ (1, 10): 0.0937632

Recall @ (2, 10): 0.194503

Recall @ (5, 10): 0.49297

Recall @ (10, 10): 1

Great, trông có vẻ đã hoạt động. Đúng vậy nếu chúng ta chỉ lấy ngẫu nhiên. Một kiểu khác chúng ta sẽ thảo luận trong paper chính thức (hay research paper là các bài nghiên cứu) là tf-idf predictor. tf-idf là viết tắt của “term frequency inverse document” tần số và các phép đo độ quan trọng của một từ trong một tài liệu quan hệ với cả corpus. Chúng ta không đi vào chi tiết (bạn có thể tìm thấy nhiều bài hướng dẫn về tf-idf trên mạng), các tài liệu có nội dung giống nhau sẽ có các một vector tf-idf tương tự (ok có thể sẽ có tutorial chống đạo văn từ cái này nhỉ). Rõ ràng nếu nội dung có các từ tương tự nhau chúng nhiều khả năng là cặp đúng. Ít nhất thì nó còn hơn là chọn ngẫu nhiên. Nhiều thư viện như scikit-learn có sẵn tf-idf functions, vì thế nên nó dễ dàng sử dụng. Chúng ta cùng tạo ra một tf-idf predictor và xem nó hoạt động tốt không.

class TFIDFPredictor:
def __init__(self):
self.vectorizer = TfidfVectorizer()

def train(self, data):
    self.vectorizer.fit(np.append(data.Context.values,data.Utterance.values))

def predict(self, context, utterances):
    # Convert context and utterances into tfidf vector
    vector_context = self.vectorizer.transform(\[context\])
    vector_doc = self.vectorizer.transform(utterances)
    # The dot product measures the similarity of the resulting vectors
    result = np.dot(vector\_doc, vector\_context.T).todense()
    result = np.asarray(result).flatten()
    # Sort by top results and return the indices in descending order
    return np.argsort(result, axis=0)\[::-1\]

# Evaluate TFIDF predictor
pred = TFIDFPredictor()
pred.train(train_df)
y = [pred.predict(test_df.Context[x], test_df.iloc[x,1:].values) for x in range(len(test_df))]
for n in [1, 2, 5, 10]: print(“Recall @ ({}, 10): {:g}”.format(n, evaluate_recall(y, y_test, n)))

Kết quả

Recall @ (1, 10): 0.495032

Recall @ (2, 10): 0.596882

Recall @ (5, 10): 0.766121

Recall @ (10, 10): 1

Chúng ta có thể thấy rằng tf-idf model tốt hơn đáng kể so với chọn ngẫu nhiên. Nhưng nó chưa được hoàn hảo. Giả định rằng chúng ta đã làm không được tốt. Đầu tiên một câu trả lời không cần thiết phải giống với câu context.

Thứ hai, tf-idf bỏ qua thứ tự của từ, cái có thể là một tín hiệu quan trọng. Với một Neural Network model chúng ta có thể làm tốt hơn.

Dual Encoder LSTM

Deep learning model mà chúng ta sẽ tạo ra trong bài viết này được gọi là Dual Encoder LSTM network. Đây chỉ là một trong nhiều cách chúng ta có thể áp dụng cho vấn đề này và nó không phải là cái tốt nhất. Bạn có thể thử với các loại kiến trúc Deep learning khác cái chưa được thử - nó là một lĩnh vực đang được nghiên cứu. Lấy ví dụ, seq2seq model thường xuyên được sử dụng trong Machine Translation (ở bài sau mình sẽ trình bày mô hình này cũng như chatbot mình làm được, mình cứ nghĩ cái mình làm được là generative model, nhưng có vẻ nó chỉ là retieval model thôi. Các bạn có thể trả lời câu hỏi này giúp mình nhé. Cám ơn các bạn) cái mà sẽ hoạt động tốt cho nhiệm vụ này. Lý do chúng ta chọn Dual Encoder là bởi vì nó được báo cáo đạt được hiệu quả tốt trên tập dữ liệu này. Điều này có nghĩa là chúng ta biết là cái chúng ta mong đợi có thể chắc chắn model của chúng ta sẽ hoạt động tốt. Việc áp dụng các model khác cho vấn đề này sẽ là một dự án thú vị. The Dual Encoder LSTM chúng ta sẽ tạo giống như (paper): Nó hoạt đống giống như sau:

  1. Tất cả các context và response được chia thành các từ và được chuyển thành dạng vector với embedded (đơn giản nó là một vector được xây dựng sẵn ví dụ từ “father” = [0 2.1 -3.4 …. 2.5] mình ví dụ như vậy). Word Embeddings được khởi tạo từ Stanford’s GloVe vectors và được fine-tuned trong suốt quá trình training (Side note: Điều này là không bắt buộc và không được thể hiện trong bức tranh. Tôi tìm thấy các word embeddings với GloVe không làm tạo ra sự khác biệt cho độ hiệu quả của model). (ok vậy cũng không quan trọng lắm việc chất lượng word embedded và việc fine-turned được nói ở trên liệu có phải trong quá trình train mình sẽ sửa lại cái ma trận word embbeded được cung cấp sẵn không, model của mình làm thì mình không thay đổi ma trận này).
  2. Tất cả các embedded context và response được cho vào cùng một Recurrent Neural Network word-by-word. Chúng ta có thể chọn vectors lớn hơn, ở đây chúng ta chọn 256 chiều.(ok mình hiểu một từ được biểu diễn 256 con số ví dụ từ “father” bên trên sẽ chuyển thành ma trận 256 cột).
  3. Chúng ta sẽ nhân c với một ma trận M để dự đoán kết quả r’. Nếu c là 1x256 chiều, thì M là 256x256 và kết quả sẽ được là vector 1x256, cái chúng ta có thể tạo ra như là generated response. Ma trận M này sẽ được học trong suốt quá trình train.(ok ma trận này được khởi tạo ngẫu nhiên và trong quá trình train ma trận này sẽ thay đổi trọng số để có thể từ đầu vào sẽ tạo ra đúng đầu ra).
  4. Chúng ta sẽ đo sự giống nhau của kết quả r’ và kết quả thực sự bằng cách dot product(nhân ma trận) giữa hai vector. Một dot product lớn nghĩa là hai vectors giống nhau.(ok 1x256 nhân 256x1 sẽ được 1x1 một số nhưng mình vẫn chưa hiểu sao số này lớn 2 vector lại giống nhau ví dụ 0.1x0.5 > 0.1x0.1 nhưng 0.1 và 0.1 giống nhau hơn). Sau đó chúng ta sẽ áp dụng hàm sigmoid function để chuyển kết quả này thành xác suất. Bước 3 và 4 đã bao gồm trong hình.

Để train model, chúng ta cần một loss(cost) function. Chúng ta sẽ sử dụng binary cross-entropy loss là thường sử dụng cho classification problems. Chúng ta sẽ gọi true label cho cặp context-response y. 1 đúng 0 sai. Lấy predicted xác suất từ 4. Sau đó dùng cross entropy loss được tính toán L= −y * ln(y’) − (1 − y) * ln(1−y’). (ok các bạn không cần quá lo lắng chúng ta có sẵn cross entropy loss trong các deep learning framework như tensorflow, pytorch, … Nếu các bạn vẫn cảm thấy khó chịu thì chúng ta sẽ học machine learning căn bản và deep learning, thời gian sẽ trả lời, …). Chúng ta sẽ sử dụng cả numpy, pandas, tensorflow và tf learn(tổng hợp của các hàm tiện ích bậc cao cho tensorflow cái này mình không biết mình dùng tensorflow low level và thấy thuận tiện còn muốn high level thì mình dùng keras món tf learn này mình chưa thử).

Tiền xử lý

Dataset chính thức có định dạng CSV. Chúng ta có thể làm việc trực tiếp với CSV nhưng tốt hơn để thuận tiện cho việc chuyển dữ liệu sang dạng tensorflow. (Quick side note: tf.SequenceExample nhưng nó dường như không được hỗ trợ bởi tf.learn nữa. ok bản thân mình không hiểu mấy cái này). Lợi ích chính của định dạng này là cho phép chúng ta load tensor trực tiếp từ input files và để tensorflow xử lý tất cả việc shuffling, batching, queuing của inputs (ok nghe hay nhỉ). Một phần của việc tiền xử lý là chúng ta cần tạo ra vocabulary. Nghĩa là chúng ta sẽ map mỗi từ thành một con số, ví dụ “cat” thành 2631. TFRecord files sẽ chuyển lưu trữ thành các con số thay thế các chuỗi. Chúng ta sẽ lưu vocabulary vì thế chúng ta có thể map các con số trở lại thành các từ sau này. Mỗi một example sẽ bao gồm các trường sau: context: Một sequence of word ids được biểu diễn context text ví dụ [231, 2190, 737, 0, 912] biểu diễn cho “tf learn làm hết rồi”. context_len: Chiều dài của context là 5 cho ví dụ bên trên utterance: Một sequence of word ids biểu diễn cho utterance (response) utterance_len: Chiều dài utterance label: Chỉ cho training data là 0 hoặc 1 distractor_[N]: Chỉ cho test/validation data. N từ 0 đến 9. Một sequence of word ids trình bày distractor utterance distractor_[N]_len: Chỉ cho test/validation data, chiều dài cho cái bên trên The preprocessing đã xong với prepare_data.py.Python script, cái sẽ tạo ra 3 files: train.tfrecords, validation.tfrecords and test.tfrecords. Bạn có thể tự chạy script hoặc tải các data file từ đây .

Tạo một input function

Để sử dụng Tensorflow’s built-in hỗ trợ cho việc training và đánh giá chúng ta cần tạo ra các input function - một function sẽ trả về tập dữ liệu cho chúng ta. Trong thực tế, bởi vì dữ liệu training và dữ liệu test khác nhau về định dạng, chúng ta cần phải có các input functions khác nhau cho chúng. Input function nên trả về batch of features và nhãn (nếu có sẵn). Đây là một vài dòng mã giả:

def input_fn():

TODO Load and preprocess data here

return batched_features, labels

Bởi vì chúng ta cần input function khác nhau trong suốt quá trình training và đánh giá và bởi vì chúng ta ghét việc phải lặp lại code, chúng ta tạo ra một wrapper gọi là create_input_fn cái mà tạo ra một input function cho các mode thích hợp. Nó thêm một vài tham số khác. Đây là định nghĩa chúng ta sử dụng:

def create_input_fn(mode, input_files, batch_size, num_epochs=None):
def input_fn():

# TODO Load and preprocess data here
return batched_features, labels

return input_fn

Đầy đủ code chúng ta có thể tìm thấy trong [udc_inputs.py](https://github.com/dennybritz/chatbot-retrieval/blob/master/udc_inputs.py).Một high level function làm được những thứ sau:

  1. Tạo một feature definition để mô tả các trường của chúng ta.
  2. Đọc vào các dòng từ input_files với tf.TFRecordReader
  3. Parse các records thành các feature definition (có lẽ là thành một example với định dạng như phần tiền xử lý mình nói ở trên)
  4. Trích xuất training labels
  5. Tạo batch nhiều mẫu và training labels
  6. Trả về batch và training labels

Định nghĩa cách đánh giá model. Chúng ta đã nhắc đến việc chúng ta muốn sử dụng recall@k metric để đánh giá model của chúng ta. Thật may mắn Tensorflow đã có sẵn với nhiều evaluation metrics cho chúng ta có thể sử dụng bao gồm cả including recall@k. Để sử dụng metrics này chúng ta cần tạo một từ điển maps từ tên số liệu tới một hàm nhận predictions (cái chúng ta dự đoán) và labels(kết quả thật sự) làm tham số.

def create_evaluation_metrics():
eval_metrics = {}
for k in [1, 2, 5, 10]: eval_metrics[“recall_at_%d” % k] = functools.partial(
tf.contrib.metrics.streaming_sparse_recall_at_k,
k=k)
return eval_metrics

Bên trên chúng ta sử dụng [functools.partial](https://docs.python.org/2/library/functools.html#functools.partial) để chuyển functions nhận 3 tham số tới một cái functions nhận hai tham số (mình không thực sự hiểu lắm). Đừng để tên streaming_sparse_recall_at_k khiến bạn nhầm lẫn. Streaming chỉ có nghĩa là hàm tích lũy thông qua các batches và làm rời rạc để cùng định dạng với labels của chúng ta (kiểu cộng dồn qua các batch và chuyển về dạng 0 1 với định dạng labels). Điều này mang lại một điểm quan trọng: Định dạng chính xác cho predictions là gì? Trong suốt quá trình training chúng ta dự đoán xác suất của các example là đúng. Nhưng trong suốt quá trình đánh giá mục đích của chúng ta là tính điểm cho utterance và 9 distractors và chọn ra cái tốt nhất. Bài viết chưa hoàn thành, mình sẽ cập nhật sớm nhất có thể, …

Kết luận

Trong bài viết này chúng ta đã implemented một retrieval-based neural network model cái có thể assign score tới câu trả lời tiềm năng với một context cho trước. Vẫn có nhiều điểm để cải thiện như thử các neural networks khác làm tốt hơn nhiệm vụ này hơn là Dual LSTM encoder. Cũng có nhiều hyperparameter optimization hoặc cải thiện quá trình tiền xử lý. The Code and data for this tutorial is on Github, so check it out.

Kết thúc

Như vậy là mình đã dịch xong http://www.wildml.com/2016/07/deep-learning-for-chatbots-2-retrieval-based-model-tensorflow/ Đây là một bài hướng dẫn hay phải không các bạn. Còn một số chỗ mình chưa hiểu, và mình cũng chưa tự làm lại thì chưa thể nói là của mình được. Tóm lại chúng ta sử dụng recall@k để đánh giá, sử dụng Dual LSTM encoder để train, if-idf để biết được độ giống nhau với tham vọng làm được một hệ thống chống đạo văn, Ngoài keras còn có một thứ tên là tf-learn nữa cần phải đọc qua, và cái chatbot mình đang build dùng seq2seq machine translation model thì có vẻ là một dạng retrieval based model chứ không phải generative models. Mình mong bài hướng dẫn cho các bạn và có thể góp ý các phần bình luận trong đóng mở ngoặc tròn mà mình còn chưa hiểu. Trong bài tiếp theo mình sẽ hướng dẫn tiếp tạo chatbot với mô hình seq2seq. Cám ơn các bạn