BERT
4.4.2.4 Mơ hình tổng hợp Multitask MusicTransformer
Như đã phân tích ở trên, mơ hình Seq2Seq gồm cả các khối mã hố và dịch mã, trong khi mơ hình MusicTransformerXL chỉ gồm các khối dịch mã, mơ hình phối lại BERTMasking chỉ có các khối mã hố. Do đó có thể tận dụng khối dịch mã của mơ hình Seq2Seq để xây dựng mơ hình MusicTransformerXL, và khối mã hố của mơ hình Seq2Seq để xây dựng mơ hình BERTMasking, sau đó thực hiện huấn luyện chúng đồng thời bằng các bộ (đầu vào, mục tiêu) khác nhau. Lưu ý rằng khối dịch mã của mơ hình MusicTransformerXL chỉ nhận giá trị từ khối mã hố trước, khơng có luồng giá trị từ khối mã hố. Mơ hình kết hợp từ 2 mơ hình này được gọi là MultitaskTransformer. Chi tiết hiện thực mơ hình Multitask MusicTransformer sẽ được trình bày chi tiết hơn ở phần tiếp theo.
5
HIỆN THỰC HỆ THỐNG
Trong chương này, chúng tơi trình bày các bước trong q trình hiện thực mơ hình học sâu tổng hợp âm nhạc và các mô tả về hệ thống ứng dụng sử dụng mơ hình học sâu trên qua các phần thu thập và xử lý dữ liệu, mơ tả, đặc tả mơ hình và hiện thực hệ thống ứng dụng
Mục lục
5.1 Thu thập dữ liệu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
5.2 Hiện thực mơ hình . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
5.1 Thu thập dữ liệu
Trong phần này, chúng tôi xin được trình bày về định dạng tệp tin dữ liệu nhóm sử dụng trong luận văn, các nguồn thu thập dữ liệu và một số thống kê sơ bộ về lượng dữ liệu thu thập được. Đồng thời trong phần này, nhóm cũng sẽ trình bày về các xử lý dữ liệu đầu vào cho mơ hình học sâu tổng hợp âm nhạc.
5.1.1 Tập tin MIDI - Musical Instrument Digital Interface
MIDI (Musical Instrument Digital Interface) hay Giao diện kỹ thuật số dành cho nhạc cụ là chuẩn công nghiệp về nghi thức giao thông điện tử định rõ các nốt âm nhạc trong nhạc cụ điện tử như là bộ tổng hợp chính xác và ngắn gọn, để nhạc cụ điện tử và máy tính trao đổi dữ liệu, hoặc "nói", với nhau. MIDI khơng truyền âm thanh – nó chỉ truyền thơng tin điện tử về một bản nhạc. MIDI có thế được sử dụng cho các mục đích khác, nhưng mục tiêu ban đầu cho việc phát minh MIDI vẫn là phục vụ cho âm nhạc. Chuẩn MIDI bao gồm 3 thành phần: Giao thức (protocol), Phương tiện kết nối (connector) và Dạng tập tin lưu trữ MIDI tiêu chuẩn (standard MIDI file).[28] Ở luận văn của chúng tôi, định dạng của bộ dữ liệu được lưu dưới dạng tập tin lưu trữ MIDI tiêu chuẩn.
Dạng tập tin lưu trữ MIDI tiêu chuẩn là định dạng tập tin cung cấp một phương thức chuẩn hóa cho việc lưu trữ, truyền và đọc các chuỗi âm thanh bởi các hệ thống khác nhau. Tiêu chuẩn này được phát triển và duy trì bởi tổ chức MMA - MIDI Manufacturers Association, và thường dùng định dạng file với đi.mid.[29] Bởi kích thước nhỏ ngọn và tiện dụng, những file này được sử
dụng rộng rãi trong các thiết bị điện tử như máy tính, nhạc chng điện thoại di động, các trang web được cấp phép và thiệp mừng kèm âm thanh. Những file này được sinh ra nhằm áp dụng phổ biến và mang những thông tin như giá trị nốt, thời gian và tên. Lời cịn có thể được thêm vào dưới định metadata, và có thể được hiển thị bởi các máy karaoke.
Tập tin lưu trữ MIDI thực chất không phải là tập tin ghi âm mà là tập các lệnh liên quan đến âm thanh như cao độ hay nhịp độ và chiếm ít bộ nhớ hơn gấp nghìn lần so với các bản ghi âm tương tự.[30] Điều này làm việc chia sẻ âm thanh bằng các tập tin MIDI dễ dàng và thú vị hơn, trước khi xuất hiện kết nối internet băng tần cao và ổ cứng dung lượng lớn.
Tuy nhiên với sự nhỏ gọn và tiện lợi của mình mà tập tin lưu trữ MIDI đã được chúng tôi tin tưởng lựu chọn làm định dạng dữ liệu để đọc, ghi cũng như xử lí cho luận văn này.
5.1.2 Tập dữ liệu thu thập
Với mục tiêu ban đầu của luận văn là xây dựng một hệ thống sinh nhạc áp dụng mơ hình học sâu, nhóm quyết định chọn thể loại nhạc cơ bản - nhạc cổ điển - để áp dụng vào mơ hình. Bời vì thể loại đa dạng nhưng vẫn có nét tương đồng giữa những tác phẩm cùng thời và các tác phẩm chịu nhiều ảnh hưởng từ thế hệ trước. Khơng chỉ vậy thể loại này có rất nhiều tập dữ liệu có sẵn và miễn phí trên internet, đồng thời những tập dữ liệu này dễ dàng phân loại theo nhịp và tác giả. Từ đó nhóm tiếp tục tìm kiếm các tập dữ liệu của các bài nhạc cổ điển dưới dạng các file MIDI của các nhà soạn nhạc tên tuổi như Bach (1685 - 1750), Beethoven (1770 - 1827), Mozart (1756 - 1791), Chopin (1810 - 1849), ...
vào bộ dữ liệu liên quan đến các tác giả nổi tiếng kể trên.
Nhóm tổng hợp các bản nhạc và phân loại theo nhịp với tổng cộng 330 bản nhạc, nhóm tập trung chủ yếu vào các tập dữ liệu có nhịp 2:4, 3:4, 4:4 với thơng tin số lượng cụ thể của từng tập được trình bày ở bảng 5.1.
Nhịp Tổng số bài 2:4 58
3:4 71 4:4 112
Bảng 5.1:Bảng thống kê số lượng bản nhạc phân loại theo nhịp
5.1.3 Lọc dữ liệu
Với tập dữ liệu nhóm đã thu thập từ các nguồn, nhóm phân loại các bài hát theo nhịp 2:4, 3:4, 4:4. Sau khi phân loại theo nhịp, để dữ liệu các bài nhạc có thể được biểu diễn và được đưa vào mơ hình huấn luyện nhóm sẽ tiếp tục lọc lại các bài hát chỉ gồm 2 phần hoặc ít hơn. Sau khi đã lọc lại theo tiêu chí trên, số bài hát cịn lại của tạp dữ liệu như bảng dưới đây.
Nhịp Tổng số bài 2:4 55
3:4 70 4:4 99
Bảng 5.2:Bảng thống kê số lượng bản nhạc phân loại theo nhịp sau khi lọc
5.2 Hiện thực mơ hình
Nhóm đã áp dụng masked language model với BERT như mô tả, tuy nhiên kết quả sinh nhạc của mơ hình sau huấn luyện không đạt được những kỳ vọng đề ra và chất lượng bài hát được sinh ra tự động có phần lộn xộn, sai luật nhạc hơn so với mơ hình chưa áp dụng cách này vào để huấn luyện. Do đó, nhóm quyết định khơng tiếp tục theo hướng này, mơ hình Multitask MusicTransformer chỉ tập trung vào 2 mơ hình là mơ hình sinh nhạc MusicTransformerXL và mơ hình "dịch" giai điệu-hợp âm Seq2Seq.
Mơ hình Multitask MusicTransformer được xây dựng bằng thư viện PyTorch và fastai. Mơ hình gồm 2 phần là bộ mã hố và bộ dịch mã, trong đó mỗi bộ gồm 8 lớp mã hố/ dịch mã tương ứng. Trong đó, cả bộ mã hố và bộ dịch mã của mơ hình đều được hiện thực bởi lớpMTEncoder.
Như đã đề cập ở trên, tầng tập trung của bộ mã hoá là tập trung 2 chiều, trong khi tầng tập trung của bộ dịch mã chỉ có 1 chiều là chiều tiến về các token đứng trước token cần dự đốn, chiều nhìn về các token đứng sau đã bị che lại (mask). Do đó, ở hàm khởi tạo của lớpMTEncodersẽ có 1 biến booleanis_decoderđể kiểm tra rằng, đối tượngMTEncoderđược khởi tạo là bộ mã hoá hay dịch mã, từ đó xác định xem tầng tập trung có bị che khuất 1 chiều hay khơng.
2 lm_mask = r a n d _ w i n d o w _ m a s k ( lm_len , self. embed . mem_len , x_lm . device , max_size =self. mask_steps , p =self. mask_p , is_eval =not self. training )
3 else:
4 lm_mask = None
Bên cạnh đó, mơ hình cũng chỉnh sửa thêm cơ chế tập trung một chiều: thay vì chỉ che các token đứng sau token hiện tại nhằm mục đích khơng cho mơ hình biết trước kết quả cần dự đốn, ta có thể che một vài token đứng trước. Việc này buộc mơ hình phải dự đốn thêm một vài bước ở trước và giúp mơ hình tăng tính tổng qt hố của dự đốn hơn.
Để có thể huấn luyện mơ hình MultitaskTransformer, bộ dữ liệu huấn luyện cần được xử lý để mơ hình có thể "hiểu" và phân loại được bộ (đầu vào, mục tiêu) thuộc về tác vụ nào. Một cách xử lý khá đơn giản và trực quan đó là đánh nhãn (tagging) vào các bộ (đầu vào, mục tiêu). Đoạn code xử lý như sau:
1 class M u l t i T r a n s f o r m e r ( nn . Module ) :
2 def _ _init__ (self, encoder , decoder , head , mem_len ) :
3 super() . __init_ _ ()
4 self. encoder = encoder
5 self. decoder = decoder
6 self. head = head
7 self. d e f a u l t _ m e m _ l e n = mem_len
8 self. c u r r e n t _ m e m _ l e n = None
9
10 def forward (self, inp ) :
11 # data order : next word , melody , chord
12 outputs = {}
13 lm , c2m , m2c = [ inp . get ( key ) for key in [’ lm ’, ’ c2m ’,
’ m2c ’]]
14
15 if lm is not None :
16 outputs [’ lm ’] = self. head (self. decoder ( lm [’x ’] , lm [’ pos ’]) )
17
18 if c2m is not None :
19 self. reset ()
20 c2m_enc = self. encoder ( c2m [’ enc ’] , c2m [’ enc_pos ’])
21 c2m_dec = self. decoder ( c2m [’ dec ’] , c2m [’ dec_pos ’] ,
c2m_enc )
22 outputs [’ c2m ’] = self. head ( c2m_dec )
23
24 if m2c is not None :
25 self. reset ()
26 m2c_enc = self. encoder ( m2c [’ enc ’] , m2c [’ enc_pos ’])
27 m2c_dec = self. decoder ( m2c [’ dec ’] , m2c [’ dec_pos ’] ,
m2c_enc )
28 outputs [’ m2c ’] = self. head ( m2c_dec )
29
Đoạn code trên có thể tóm tắt như sau:
1. Nếu đầu vào có nhãn ’lm’, thì sẽ được sử dụng để huấn luyện bộ mã hoá (tương ứng tác vụ sinh nhạc của mơ hình MusicTransformerXL)
2. Nếu đầu vào có nhãn ’c2m’, ’m2c’ thì sẽ được sử dụng cho huấn luyện cả bộ mã hoá và giải mã (tương ứng với tác vụ "dịch" của mơ hình Seq2Seq), trong đó, nhãn ’c2m’ tương ứng với huấn luyện tác vụ "dịch" từ hợp âm sang giai điệu, và ngược lại nhãn ’m2c’ sẽ được dùng cho huấn luyện tác vụ "dịch" từ giai điệu sang hợp âm.
Cấu hình của mơ hình dựa trên cấu hình TransformerXL của fastai và được chỉnh sửa một số thông số:
1 def d e f a u l t _ c o n f i g () :
2 config = t f m e r X L _ l m _ c o n f i g . copy ()
3 config [’ act ’] = A c t i v a t i o n . GeLU
4 5 config [’ mem_len ’] = 512 6 config [’ d_model ’] = 512 7 config [’ d_inner ’] = 2048 8 config [’ n_layers ’] = 16 9 10 config [’ n_heads ’] = 8 11 config [’ d_head ’] = 64 12 13 return config
Theo đó, mơ hình sử dụng hàm GeLU (Gaussian Error Linear Unit) thay cho hàm ReLU trong cấu hình gốc. Hàm kích hoạt này được giới thiệu vào năm 2016 và được sử dụng bởi các mơ hình Transformers – Google’s BERT và OpenAI’s GPT-2. GeLU có thể tránh được hiện tượng mất mát đạo hàm (vanishing gradient), đồng thời đạt được kết quả SOTA trong những mơ hình xử lý ngơn ngữ tư nhiên và đặc biệt phù hợp cho mơ hình Transformer.
Q trình huấn luyện mơ hình sử dụng phương pháp Mixed Precision và One cycle để tăng tốc độ huấn luyện.
1 learn . to_fp16 ( dynamic = True , clip =0.5) ;
2 learn . f i t _ o n e _ c y c l e (10)
Trong đó, q trình huấn huyện được thực hiện với learning_rate là 0.001 và tổng số epoch là 10. Nhóm thực hiện huấn luyện mơ hình trên các tập dữ liệu 2:4, 3:4, 4:4 đã được nhóm thu thập và phân loại ở trên.
5.3 Mơ tả và hiện thực hệ thống tổng hợp nhạc
5.3.1 Kiến trúc tổng thể
Hình 5.1:Kiến trúc tổng thể
• Client side là thành phần hệ thống nằm phía bên phía người dùng. Người dùng tương tác với hệ thống thông qua giao diện. Ngồi ra, thơng qua giao diện người dùng sẽ gửi các yêu cầu (request) đến máy chủ API (Server REST API).
• Server side bao gồm máy chủ API (Server REST API) và mơ hình học sâu tổng hợp nhạc (Model).
5.3.2 Sơ đồ tình huống sử dụng (Use Case Diagram)