Xin chào và chào mừng bạn đến với hướng dẫn Python này.
Được rồi, vì vậy chúng tôi có những hướng dẫn rất thú vị trước mắt.
Chúng ta sẽ bắt đầu bằng cách tạo ra kiến trúc của mạng nơ-ron.
Đó là, chúng tôi sẽ tạo ra mạng nơ-ron trung tâm của AI của chúng tôi và điều đó sẽ trả lại hành động để
chơi tại mỗi thời điểm.
Nhìn thấy?
Vì vậy, chúng ta hãy làm điều này.
Vì vậy, vì chúng ta muốn mạng nơ-ron của mình là một đối tượng, chúng ta sẽ tạo một lớp.
Và đó là bởi vì nó thuận tiện hơn nhiều.
Biết một lớp là mô hình của thứ mà chúng ta muốn xây dựng.
Chúng ta muốn xây dựng một mạng nơ-ron và chúng ta cần thực hiện một số loại hướng dẫn mà tất cả
sẽ được chứa trong một lớp.
Và trong lớp này, chúng ta sẽ tạo ra hai hàm.
Đầu tiên, hàm init, là hàm xuất hiện mọi lúc khi tạo một lớp và về
cơ bản nó xác định biến đối tượng của bạn.
Đó là mạng nơ-ron, bạn biết đấy, các biến được gắn với đối tượng trái ngược với các biến
toàn cục.
Và đây là trong hàm init này sẽ xác định kiến trúc của mạng nơ-ron, xác định lớp đầu vào
sẽ bao gồm năm tế bào thần kinh đầu vào vì chúng ta có năm chiều cho vector được mã hóa của
trạng thái đầu vào, sau đó chúng ta sẽ xác định một số lớp ẩn .
Có thể chúng ta sẽ bắt đầu với một lớp ẩn và sau đó bạn sẽ được hoan nghênh thử một số kiến
trúc khác của mạng nơ-ron.
Và sau đó, tất nhiên chúng ta sẽ kết thúc với lớp đầu ra sẽ chứa các hành động khả thi mà chúng ta có
thể chơi tại mỗi thời điểm.
Vì vậy, đó chính xác là những gì chúng ta sẽ làm trong hàm init này.
Và sau đó chúng ta sẽ tạo một hàm khác vẫn còn bên trong lớp, đó sẽ là hàm chuyển
tiếp và đó sẽ là hàm sẽ kích hoạt các nơ-ron trong mạng nơ-ron, bạn biết đấy,
sẽ kích hoạt các tín hiệu.
Và vì vậy, chúng tôi sẽ sử dụng một chức năng kích hoạt bộ chỉnh lưu vì tất nhiên chúng tôi đang giải quyết một vấn đề
hoàn toàn phi tuyến và chức năng chỉnh lưu này phá vỡ tuyến tính.
Nhưng chủ yếu là chúng tôi thực hiện hàm chuyển tiếp này để trả về các giá trị Q, là đầu ra
của mạng nơ-ron.
Nhưng chúng ta có một giá trị cue cho mỗi hành động và sau này chúng ta sẽ trả lại hành động cuối cùng bằng cách lấy
giá trị tối đa của các giá trị cue hoặc sử dụng phương thức soft max.
Chúng ta sẽ thấy điều đó sau đây.
Vì vậy, trong hướng dẫn này, chúng ta sẽ bắt đầu bằng cách triển khai hàm init và trong phần tiếp theo,
chúng ta sẽ triển khai hàm chuyển tiếp.
Vì vậy, chúng ta hãy làm điều này.
Đầu tiên, chúng ta cần giới thiệu lớp học của mình.
Vì vậy, chúng tôi bắt đầu với lớp học.
Sau đó, chúng tôi đặt tên cho lớp của chúng tôi mà chúng tôi có thể gọi nó là mạng.
Và sau đó trong lớp mạng này, tôi sẽ sử dụng một kỹ thuật lập trình đối tượng được gọi là kế
thừa, và đó chỉ là kế thừa từ tất cả các công cụ của lớp cha.
Vì vậy, lớp mạng của chúng ta mà chúng ta sắp tạo là một lớp con của một lớp lớn hơn, đó là một mô-đun
RN DOT.
Vì vậy, đó chỉ là kế thừa từ tất cả các công cụ của lớp mô-đun này, tất nhiên là các công cụ
để triển khai mạng nơ-ron.
Vì vậy, đó là một thủ thuật rất mạnh mẽ và hiệu quả trong lập trình hướng đối tượng được gọi là kế thừa.
Và ngay bây giờ chúng ta đang kế thừa từ lớp cha mô-đun này.
Được rồi.
Và bây giờ chúng ta đã sẵn sàng vào bên trong lớp học.
Vì vậy, tôi thực sự nhấn enter hai lần, bởi vì chúng tôi sẽ tạo hai hàm và chúng tôi đang
bắt đầu với hàm init.
Vì vậy, hàm init, chúng ta phải đặt tên nó theo cách này với hai dấu gạch dưới sau đó trong nó.
Và sau đó, một lần nữa để gạch dưới đó chỉ là cú pháp Python, đó chỉ là cách chúng ta phải thực hiện và sau
đó chúng ta cần nhập các đối số.
Vì vậy, chúng tôi có ba đối số.
Cái đầu tiên là một lý lẽ bắt buộc thực sự là cái tôi và cái tôi.
Không có gì bí ẩn về nó đề cập đến đối tượng sẽ được tạo ra từ lớp này mà chúng ta sắp
tạo.
Bạn biết đấy, chúng tôi đang tạo ra lớp học này.
Nó giống như một số chỉ dẫn, một mô hình nào đó của mạng nơ-ron mà chúng tôi muốn xây dựng.
Và sau đó khi lớp đã sẵn sàng, chúng ta có thể tạo bao nhiêu mạng nơ-ron tùy thích.
Và mỗi mạng nơ-ron này sẽ là một số đối tượng của lớp này.
Và vì chúng ta sẽ sử dụng đối tượng cho một số mục đích khác, chúng ta cần xác định các biến của đối tượng
là gì.
Và để phát hiện ra điều này, chúng tôi đang sử dụng bản thân này ở đây để chỉ định rằng chúng tôi đang đề cập đến đối tượng.
Vì vậy, bất cứ khi nào tôi muốn sử dụng một biến từ đối tượng của mình, tôi sẽ sử dụng self trước biến để chỉ định
rằng đây là một biến của đối tượng.
Được rồi.
Vì vậy, đó là lập luận đầu tiên.
Và sau đó chúng ta có hai đối số khác, tất nhiên là số lượng tế bào thần kinh đầu vào và số lượng
tế bào thần kinh đầu ra.
Vì vậy, số lượng tế bào thần kinh đầu vào, chúng ta sẽ gọi nó là kích thước đầu vào.
Và đó thực sự là năm vì vectơ đầu vào của chúng tôi có năm chiều, ba tín hiệu cộng với định hướng cộng
với định hướng trừ đi.
Đó là vectơ của chúng tôi về các giá trị được mã hóa mô tả một trạng thái của môi trường.
Năm giá trị này đủ để mô tả trạng thái của môi trường.
Chúng tôi có thể nghĩ về ít giá trị hơn hoặc nhiều giá trị hơn, nhưng đó là những gì tôi đã thử.
Và nó thực sự có ý nghĩa vì chúng ta thực sự cần một tín hiệu từ bên trái, một tín hiệu trước mặt và một tín
hiệu ở bên phải.
Bạn biết đấy, khi chúng tôi đang lái xe ô tô, chúng tôi có thể đã đi theo tín hiệu 360, bạn biết đấy, giống như tín
hiệu ở đầu ô tô của Google.
Nhưng chúng ta hoàn toàn có thể tự lái với ba cảm biến.
Và sau đó, chúng tôi có định hướng này và định hướng trừ, bạn biết đấy, hãy theo dõi mục tiêu mà chúng tôi đang
cố gắng đạt được.
Và dĩ nhiên, chúng ta có các nơ-ron đầu ra của mạng nơ-ron tương ứng với các hành động.
Và chúng ta có ba hành động khả thi là đi sang trái, đi thẳng hoặc đi sang phải.
Và do đó tôi sẽ gọi nó là hành động.
Và sẽ có ba người trong số họ.
Được rồi.
Nhưng cho đến nay, chúng ta chỉ phải đặt tên cho các đầu vào và sau đó chúng ta sẽ sử dụng các biến này để thực hiện các
phép tính bên trong mạng nơ-ron.
Được rồi.
Tôi sẽ bắt đầu bằng cách sử dụng một thủ thuật PyTorch khác.
Thủ thuật này là siêu chức năng.
Đó là một chức năng thực sự kế thừa từ mô-đun RN.
Vì vậy, đó là lý do tại sao chúng tôi phải sử dụng kế thừa để kế thừa công cụ mô-đun.
Đây là công cụ đầu tiên chúng tôi sử dụng.
Và về cơ bản, chúng tôi chỉ sử dụng siêu thủ thuật này, siêu chức năng này để có thể sử dụng các công
cụ của mô-đun.
Vì vậy, điều đó hiệu quả hơn nhiều.
Và bên trong siêu chức năng này, tôi chỉ cần xác định mạng đầu tiên.
Vì vậy, đó là lớp con mạng của chúng tôi, bạn biết đấy, bởi vì nó được kế thừa
từ lớp cha mô-đun và sau đó là đối tượng của chúng tôi và sau đó tôi chỉ thêm dấu chấm và hoặc hàm init giống như cách chúng tôi đặt tên cho
nó.
Được rồi.
Vì vậy, đó chỉ là một mẹo sử dụng tất cả các công cụ của và trong mô-đun đó, sau đó chúng
ta có thể chuyển sang bước tiếp theo, đó là chỉ định lớp đầu vào.
Vì vậy, về cơ bản những gì tôi phải làm là giới thiệu một biến mới sẽ được gắn vào đối
tượng và biến này sẽ chứa số lượng nơ-ron đầu vào.
Vì vậy, không bị nhầm lẫn với kích thước đầu vào.
Kích thước đầu vào là đối số của hàm init, nhưng đó không phải là biến được gắn với đối
tượng mà là biến được gắn với đối tượng.
Như tôi vừa đề cập, chúng ta cần chỉ rõ rằng thay vào đó nó được gắn vào đối tượng.
Vì vậy, chúng tôi sử dụng một dấu chấm tự và bây giờ chúng tôi đặt tên cho biến đầu tiên này được gắn với đối tượng.
Và vì vậy chúng ta có thể chỉ cần đặt tên giống như đầu vào.
Chúng ta có thể gọi nó là kích thước đầu vào, và chúng ta sẽ nói rằng nó bằng với đối số của hàm init là kích
thước đầu vào.
Được rồi.
Vì vậy, mỗi khi tôi tạo một đối tượng từ lớp mạng và tôi đang chỉ định kích thước đầu vào, chẳng
hạn như tôi đang nhập năm, sẽ có năm ở đây và do đó biến kích thước đầu vào của đối tượng của
chúng tôi sẽ có giá trị là năm vì kích thước đầu vào này ở đây sẽ là năm và do đó mạng nơ-ron
của chúng ta sẽ có năm nơ-ron đầu vào trong lớp đầu vào.
Được rồi.
Và điều đó cũng tương tự đối với biến khác mà chúng ta muốn gắn vào đối tượng của mình.
Và như bạn có thể đoán, đây sẽ là một biến cho số lượng tế bào thần kinh đầu ra.
Và để nói rằng chúng ta tự lấy đối tượng của mình và sau đó chúng ta đặt tên cho biến thứ hai này của đối tượng
mà chúng ta sẽ gọi nó là hành động.
Và điều này sẽ bằng với đối số này ở đây, đưa ra số lượng hành động, đó là số lượng tế bào
thần kinh đầu ra.
Và vì vậy chúng tôi đặt nó bằng và là hành động.
Vì vậy, thực tế và hành động sẽ bằng ba.
Do đó, biến và hành động được gắn với đối tượng của chúng ta vào một mạng sẽ nhận giá trị là ba.
Trên thực tế, chúng ta có thể thấy một cảnh báo ở đây.
Nó nói tên không xác định và đó là vì ở đây chúng ta sử dụng phím tắt RN và chúng ta cần sử dụng phím tắt ở đây
và sau đó cho phần cuối của chúng ta trong mô-đun và sau đó nó sẽ biến mất.
Chúng ta bắt đầu.
Hoàn hảo.
Ngay bây giờ chúng tôi không có cảnh báo.
Tất cả các cảnh báo ở đây chỉ để xác định rằng những gì chúng tôi nhập chưa được sử dụng.
Nhưng nó ổn.
Chúng tôi sẽ sử dụng chúng sau đó.
Được rồi, chúng ta có hai biến khác.
Chúng tôi muốn xác định bốn đối tượng.
Và đây sẽ là các kết nối đầy đủ, các kết nối đầy đủ giữa các lớp khác nhau của mạng nơ-ron của
chúng ta.
Vì vậy, vì ngay bây giờ chúng tôi muốn tạo một mạng nơ-ron chỉ bao gồm một lớp ẩn, tốt,
sẽ có hai kết nối đầy đủ.
Sẽ có 1/1 kết nối đầy đủ giữa lớp đầu vào và lớp ẩn và 1/2 kết nối đầy
đủ giữa lớp ẩn và lớp đầu ra.
Vì vậy, hãy bắt đầu với kết nối đầy đủ đầu tiên.
Chúng tôi sẽ gọi nó là FC.
Và một lần nữa, tôi sử dụng self ở đây để chỉ định rằng FC một là biến đối tượng của tôi.
Vì vậy, tự FC đó một.
Mà sẽ bằng.
Và bây giờ chúng ta sử dụng mô-đun RN và chúng ta sẽ sử dụng một hàm được gọi là tuyến tính.
Và đó chính xác là tạo ra kết nối đầy đủ này giữa các nơ-ron của lớp đầu vào với các nơ-ron
của lớp ẩn.
Và tôi có nghĩa là gì bởi kết nối đầy đủ?
Điều đó có nghĩa là tất cả các nơ-ron của lớp đầu vào sẽ được kết nối với tất cả các nơ-ron của
lớp ẩn.
Và do đó, để tạo kết nối đầy đủ này, chúng ta sử dụng hàm tuyến tính này mà chúng ta cần nhập một số đối số.
Và như bạn có thể thấy, những đối số này nằm trong các tính năng.
Vì vậy, đó là số lượng tế bào thần kinh của lớp đầu tiên chúng ta muốn kết nối.
Sau đó, các tính năng bên ngoài, đó là số lượng tế bào thần kinh của lớp thứ hai mà chúng ta muốn kết nối.
Đó là lớp ở bên phải, đó là lớp ẩn và bias bằng true.
Vì vậy, thành kiến bằng đúng.
Chúng tôi sẽ giữ giá trị mặc định để có độ lệch và không chỉ một số cách để gắn vào các nơ-ron,
chúng tôi sẽ có trọng số và một độ lệch cho mỗi lớp.
Và vì vậy, chúng ta hãy xem những gì chúng ta cần nhập.
Vì vậy, đối số đầu tiên trong các tính năng là số lượng tế bào thần kinh đầu vào trong lớp đầu vào.
Và vậy nó là gì?
Đó thực sự là kích thước đầu vào.
Đó là đối số của hàm init, sau này sẽ bằng năm định hướng ba tín hiệu và
định hướng trừ.
Vì vậy, chúng ta bắt đầu.
Chúng tôi nhập kích thước đầu vào đối số đầu tiên.
Và sau đó đối số thứ hai là về các tính năng.
Đó là số lượng tế bào thần kinh mà chúng ta muốn có trong lớp thứ hai, lớp thứ hai sẽ được
kết nối hoàn toàn với lớp đầu tiên.
Và bây giờ câu hỏi đặt ra là chúng ta muốn có bao nhiêu tế bào thần kinh trong lớp ẩn này?
Chà, tôi đã điều chỉnh rất nhiều tham số.
Tôi đã thử nghiệm rất nhiều.
Đó là những gì chúng tôi làm trong AI hoặc đó là những gì chúng tôi làm trong học sâu.
Nói chung, chúng tôi thực hiện rất nhiều thử nghiệm để xem đâu sẽ là mạng nơ-ron tốt nhất cho vấn đề cụ thể của
chúng tôi.
Và vì vậy tôi đã thử nhiều giá trị và cuối cùng tôi chọn 30, 30 nơ-ron trong một lớp ẩn.
Và bạn sẽ thấy rằng với con số này, chúng ta sẽ thu được một số kết quả khá khả quan.
Nhưng sau đó, hãy thoải mái thay đổi kiến trúc của mạng nơ-ron.
Hãy thoải mái chơi với nó.
Bạn không chỉ có thể thay đổi số lượng tế bào thần kinh ẩn trong lớp ẩn mà còn có thể thêm
một số lớp nữa để có thể có được một chiếc xe thậm chí còn tốt hơn.
Nhưng 3000 tế bào thần kinh sẽ giúp chúng ta có được một mạng lưới thần kinh tốt và một chiếc xe tốt.
Vì vậy, đó là những gì chúng tôi đi cho.
Và chúng ta bắt đầu.
Chúng tôi có kết nối đầy đủ đầu tiên của chúng tôi thực sự với hàm tuyến tính này.
Chúng tôi tạo kết nối đầy đủ giữa lớp đầu vào và lớp ẩn.
Và bây giờ là lúc để thực hiện kết nối đầy đủ thứ hai.
Đó là kết nối đầy đủ giữa lớp ẩn và lớp đầu ra.
Vậy là xong.
Chúng tôi sẽ gọi đây là kết nối đầy đủ thứ hai.
FC hai Chúng ta đi.
Và đây vẫn là một biến từ đối tượng của chúng ta.
Vì vậy, tôi đang sử dụng công cụ
ở đây và sau đó chúng tôi sử dụng
tốt.
Cũng vậy thôi.
Đầu tiên là số lượng tế bào thần kinh mà chúng ta muốn có trong lớp đầu tiên của kết nối thức ăn.
Vì vậy, đó là lớp ẩn và do đó đó là 30.
Và đối số thứ hai là số lượng tế bào thần kinh trong lớp thứ hai của kết nối thức ăn và
tương ứng với lớp đầu ra.
Và lớp đầu ra có và là các nơ-ron hành động, sau này sẽ là ba vì chúng ta có ba hành động
khả thi.
Nhưng cho đến nay chúng ta phải sử dụng các tên mà chúng ta đã xác định, đó là tên của đối số của
hàm init và do đó chúng ta nhập vào đây và là hành động.
Và chúng ta bắt đầu.
Trước hết, hai kết nối đầy đủ của chúng tôi đã sẵn sàng và thứ hai, hàm init của chúng tôi đã sẵn sàng.
Vì vậy, đó là những gì chúng ta sẽ khởi tạo đối tượng của mình bất cứ khi nào chúng ta tạo một đối tượng từ lớp mạng.
Và vì vậy ngay sau khi chúng ta tạo một đối tượng, tất cả các biến này, bốn biến ở đây kích thước đầu
vào và là hành động FC một và FC hai sẽ được xác định.
Và đó là cách chúng ta sẽ có được kiến trúc của mạng nơ-ron của chúng ta.
Đối với mỗi đối tượng mà chúng ta tạo ra, mỗi đối tượng sẽ tương ứng với một mạng lưới thần kinh
gồm 5 nơ-ron đầu vào, 30 nơ-ron ẩn và 3 nơ-ron đầu ra.
Vậy là xong.
Chúng ta đã thực hiện xong với hàm init đầu tiên này và bây giờ chúng ta có thể chuyển sang hàm
thứ hai, là hàm chuyển tiếp và sẽ được sử dụng để kích hoạt các nơron trong mạng nơron bằng cách sử dụng chức năng
kích hoạt bộ chỉnh lưu, và chủ yếu là cuối cùng trả về Q các giá trị là kết quả đầu ra của mạng nơ-ron của
chúng ta.
Vì vậy, tôi không thể chờ đợi để làm điều này trong hướng dẫn tiếp theo.
Và cho đến khi đó, hãy tận hưởng.
TÔI.