Kiến trúc mơ hình Seq2Seq ("dịch" từ hợp âm sang giai điệu)

Một phần của tài liệu Tổng hợp âm nhạc sử dụng học sâu (Trang 68)

Trong đó, các khối mã hố (encoder) sử dụng một tầng tập trung 2 chiều, cho phép nó có thể quan sát được các token ở phía trước và sau. Bên cạnh đó, các khối dịch mã sử dụng 2 tầng tập trung. Tương tự như mơ hình chính MusicTransformerXL, khối dịch mã của mơ hình Seq2Seq cũng sử dụng forward attention cho phép nó chỉ nhìn thấy các token ở phía trước token cần dự đoán. Điều này để tránh xảy ra sự gian lận trong q trình huấn luyện. Tầng tập trung cịn lại của khối dịch mã nhận kết quả từ tầng tập trung trước nó và kết quả từ khối dịch mã. Bên cạnh đó, đầu ra liền trước (previous output) cũng được truyền trở lại vào khối dịch mã để nó có thể biết được đoạn nào đã được "dịch" xong rồi.

Tác vụ "dịch" giai điệu từ hợp âm cũng tương tự như "dịch hợp âm từ giai điệu, chỉ có đầu và và đầu ra được đổi ngược lại.

Hình 4.12:Kiến trúc mơ hình Seq2Seq ("dịch" từ giai điệu sang hợp âm)

4.4.2.3 Mơ hình hỗ trợ masked language modeling với BERT

Khi sử dụng các mơ hình học sâu để huấn luyện và sinh nhạc tự động sẽ có những vấn đề như các bài hát được tạo ra sẽ có những phần bị lặp lại nhiều, bài hát khơng có tính đột phá và cực kỳ an toàn và nhịp điệu của bài hát chưa được bắt tai người nghe. Tác giả đưa ra hướng xử lý bằng cách có thể xóa đi một vài đoạn nhạc trong các bài hát, sau đó để mơ hình có thể tự đọng sinh ra những đoạn mới mới để lấp vào chỗ trống. Việc này vừa giúp mơ hình khắc phục hoặc giảm nhẹ các khuyết điểm đã trình bày trước đồng thời tạo ra nhiều kiểu nhạc mới cho mơ hình với việc tự động điền vào như vậy.

Lúc này, sẽ có thêm việc giải quyết bài tốn điền vào chỗ trống. Để giải quyết bài toán điền vào chỗ trống, tác giả đã đưa thêm masked language modeling với BERT vào mơ hình để xử lý vì BERT được sử dụng nhiều trong các bài toán trả lời câu hỏi và điền vào chỗ trống.

Tác giả đã đề xuất việc kết hợp mơ hình và lớp BERT mask ở tầng encoder. Ở đây, các bài hát khi được mã hóa thành chuỗi token và các dữ liệu ngữ cảnh, một số nốt nhạc sẽ được xóa đi thay thế bằng ký tự quy định sau đó sử dụng BERT để mơ hình có thể tự động đốn và điền vào phần bị xóa đi. Việc sử dụng BERT có thể cho mơ hình có thể quan sát các token trước và sau giúp mơ hình có thể nắm được ngữ cảnh của nốt nhạc và ngữ cảnh của nó tốt hơn, qua đó huấn luyện cho mơ hình các luật về nhịp, hịa âm, ... sẽ nhanh hơn. Đồng thời, việc tự mơ hình sinh ra để điền vào có thể tạo ra những bài nhạc biến tấu đi góp phần tạo nên độ đa dạng và sáng tạo cho bài hát.

Hình 4.13:Mơ hình lớp encoder kết hợp với phương pháp masked language modeling sử dụngBERT 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ã hố (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)

Hình 5.2:Use Case Diagram cho hệ thốngCác thành phần cụ thể như sau: Các thành phần cụ thể như sau:

User: người dùng cuối của trang web tổng hợp nhạc

Server: server mà người dùng tương tác

• Functions

Login/Logout: chức năng để người dùng đăng ký, đăng nhập và đăng xuất khỏi hệ thống

Generate music: chức năng của hệ thống sẽ tạo ra bài nhạc từ các nốt nhạc mồi đầu vào của người dùng

Download song: chức năng của hệ thống cho phép người dùng tải bài hát được sinh ra từ hệ thống với đầu vào các nốt nhạc mồi của người dùng

Save song: chức năng lưu bài hát của hệ thống

5.3.3 Kiến trúc vật lý

Hệ thống hỗ trợ tổng hợp nhạc đợc nhóm xây dựng dựa trên kiến trúc Client-Server, bao gồm 2 phần chính là Client Side và Server Side.

Client sidelà ứng dụng web được viết bằng thư viện React của JavaScript.

Server sidebao gồm 3 thành phần chính đó là API Server, Model và Database.

Server REST API: cung cấp các APIs để phía Client kết nối, truy xuất dữ liệu. Server được viết bằng thư viện Flask của Python.

Database: là nơi lưu trữ dữ liệu của hệ thống. Thông tin lưu trữ trong cơ sở dữ liệu bao gồm thông tin người dùng, thông tin các bài hát người dùng đã lưu. Nhóm lựa chọn MongoDB làm cơ sở dữ liệu cho hệ thống của mình.

Một phần của tài liệu Tổng hợp âm nhạc sử dụng học sâu (Trang 68)

Tải bản đầy đủ (PDF)

(94 trang)