国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

用馬爾科夫鏈玩智能作曲

2020-06-08 15:43陳凱
中國信息技術(shù)教育 2020年9期
關(guān)鍵詞:作曲列表矩陣

陳凱

在本文開頭,先給大家介紹一位作曲家,她叫Aiva,才華出眾,作品眾多,已出版過多個音樂專輯,還有不少作品在音樂廳由交響樂隊演奏。但Aiva不是一位人類作曲家,而是一個精通作曲的人工智能程序,將其作品和人類的音樂作品放在一起時,幾乎無法辨認。

教師在人工智能的課堂上,大概不會滿足于僅僅欣賞Aiva設(shè)計的音樂作品,如果能讓學(xué)生自己體驗一下人工智能的作曲過程,那該多好。Aiva的網(wǎng)站上倒是提供了自助編曲功能,用戶設(shè)置好音樂風(fēng)格、樂器和時長等參數(shù)后,就可以一鍵完成音樂作品“創(chuàng)作”,但是,除了讓學(xué)生體驗到“人工智能真厲害”之外,隱藏在“真厲害”背后的原理,卻一點兒也無法揭示出來。這也難怪,要想讓Aiva寫出質(zhì)量不亞于人類作曲家的作品,不僅需要相當(dāng)艱深的計算機科學(xué)或數(shù)學(xué)原理的支撐,而且需要大量原始樂譜作為機器學(xué)習(xí)的材料,毫無疑問,軟件設(shè)計者還需要專業(yè)的音樂創(chuàng)作技能。

那么,關(guān)于人工智能創(chuàng)作音樂的教學(xué),就只能簡單地停留在欣賞環(huán)節(jié)嗎?答案當(dāng)然是否定的。本文試圖通過一個教學(xué)活動來說明,只要選取了恰當(dāng)?shù)牟呗?,即便是在不多的課時中,也能實現(xiàn)智能作曲相關(guān)的“需求提出—數(shù)學(xué)原理揭示—計算機算法實現(xiàn)”的完整的教學(xué)過程。

循序漸進,降格以求——從一段難聽的音樂引出任務(wù)

這個教學(xué)活動的名字叫“用馬爾科夫鏈玩智能作曲”,然而,因為并不是真的要上音樂課,所以要回避音樂創(chuàng)作中節(jié)奏安排、旋律發(fā)展、樂段結(jié)構(gòu)、和弦配置、樂器配置等內(nèi)容。作為驅(qū)動人工智能學(xué)習(xí)的任務(wù)的目標(biāo),可以有策略地將智能生成音樂作品替換成“把難聽的旋律變好聽”,這樣,一方面,為任務(wù)達成設(shè)定了容易跨越的門檻,另一方面,也為學(xué)有余力的學(xué)生設(shè)定了一個長期的自主學(xué)習(xí)和探索目標(biāo)。

圖1所示的這段簡單的代碼,是利用低音的So、La、Ti和中音的Do、Re、Mi、Fa、So、La這9個音符,隨機生成一段旋律序列。代碼中用到了pysynth庫,這個庫的作用是把音符名稱轉(zhuǎn)換為聲音(Do對應(yīng)音調(diào)c,Re對應(yīng)音調(diào)d,以此類推)。在代碼中,notetune列表中添加的,就是隨機生成的音符名稱,而notedelay列表中存放的,是對應(yīng)每個音符所持續(xù)的時長,為簡單起見,每個音符延續(xù)的時間都設(shè)置成1/4拍。

程序代碼總共只有十多行,用到的流程結(jié)構(gòu)只有循環(huán),數(shù)據(jù)結(jié)構(gòu)只有列表,可以說十分簡單。但由程序隨機生成的所謂旋律簡直難聽無比,于是,怎樣才能讓隨機生成的旋律更優(yōu)美一些,自然而然就成了探索的課題。

眼觀為實,親歷其境——馬爾科夫鏈的展現(xiàn)

用來實現(xiàn)智能作曲的計算機的方法很多,如神經(jīng)網(wǎng)絡(luò)、自動機模型、貝葉斯學(xué)習(xí)等,但有一個工具,幾乎所有的智能作曲軟件都會用到,那就是馬爾科夫鏈。一段旋律的產(chǎn)生,實質(zhì)是在時間軸上將音符放置到不同的位置,而每一個音符的放置,如果只是隨機放置,并不能帶給人愉悅的感受,音符的放置必須要參考上一個音符的情況,類似的,某一個樂句或樂段的結(jié)構(gòu),也肯定和上一個樂句或樂段的結(jié)構(gòu)有關(guān)(為簡單起見,本文不涉及樂句和樂段結(jié)構(gòu)的變化)。這就涉及了教學(xué)活動中重點介紹的馬爾科夫鏈。所謂“弱水三千,只取一瓢”,不僅是因為馬爾科夫鏈在旋律的自動產(chǎn)生中起到重要作用,也同時因為這個模型非常容易用程序代碼實現(xiàn)出來,而且能便捷、直觀地觀察到效果。

那么馬爾科夫鏈?zhǔn)鞘裁茨兀堪凑諗?shù)學(xué)的定義來說,馬爾科夫鏈?zhǔn)蔷哂旭R爾科夫性質(zhì),且存在于離散的指數(shù)集和狀態(tài)空間內(nèi)的隨機過程,可以用轉(zhuǎn)移矩陣來定義。這段話未免讓人看得有些云里霧里,這是因為數(shù)學(xué)定義需要有很強的嚴謹性,但如果是拿馬爾科夫鏈來當(dāng)作解決問題的工具,那只要直觀觀察一下其工作過程,就很容易知道,為什么這個工具可以用來自動產(chǎn)生旋律了。

一個形象直觀且可交互執(zhí)行的工具名叫“Markov Chains A visual explanation”,用搜索引擎可以找到其在線運行的地址,也可以將代碼下載到本地運行。在這個工具中填寫入轉(zhuǎn)移矩陣,就可以看到馬爾科夫鏈的運作過程了(如圖2)。

怎么玩這個轉(zhuǎn)移矩陣呢?想象一下A、B、C玩拋球游戲,A更喜歡自己拋自己接,只是偶爾拋給B和C,玩家B也喜歡拋給自己,偶爾拋給A和C,但玩家C卻優(yōu)先把球拋給B,偶爾拋給A和自己。若將大概率的拋球?qū)ο蟮母怕手翟O(shè)為0.8,小概率的拋球?qū)ο蟮母怕手翟O(shè)為0.1,就得到了轉(zhuǎn)移矩陣(如下表)。

將數(shù)值填入后,就可以觀賞拋球表演了,當(dāng)然,也可以在轉(zhuǎn)移矩陣中填入其他概率值,然后觀察拋球游戲的效果。

為什么這個模型可用于自動產(chǎn)生旋律呢?想象一下,假如當(dāng)前音符是中音So,那么從人的欣賞習(xí)慣來看,更自然的后續(xù)銜接,大概率是中音Do、Mi、La等,偶爾也可能是中音Re、Fa,但概率就小了許多,至于變成低音La,概率就更小了。所以,只要將音符的變化的概率,制作成馬爾科夫轉(zhuǎn)移矩陣,就能讓程序按特定概率隨機生成聽上去更自然的旋律了。

善假于物,物盡其用——將任務(wù)融入日常算法和程序教學(xué)

在介紹了馬爾科夫鏈的工作原理后,接下來的難點,是要用學(xué)生所掌握的算法和程序知識技能,將智能旋律生成的代碼實現(xiàn)出來。整個程序中,用到的都是常用的流程結(jié)構(gòu)和數(shù)據(jù)結(jié)構(gòu),唯一困難的地方,就在于狀態(tài)轉(zhuǎn)移矩陣的建立。

建立狀態(tài)轉(zhuǎn)移矩陣的第一步,是獲得轉(zhuǎn)移矩陣的概率的數(shù)據(jù)。照理說,程序應(yīng)當(dāng)在大量的樂譜中,通過對音符逐個掃描,計算出轉(zhuǎn)移矩陣的概率,但讀取樂譜并計算概率這個工作,并不容易在有限的課時中實現(xiàn),一個便捷且有趣的方法是,讓學(xué)生分小組,用哼唱熟悉歌曲并記錄的辦法,大致將每個音符后續(xù)出現(xiàn)音符按出現(xiàn)可能性從大到小排列出來。

建立狀態(tài)轉(zhuǎn)移矩陣的第二步,是將轉(zhuǎn)移矩陣變成列表或數(shù)組,為了避免復(fù)雜的概率上的計算,有一個“投機取巧”的辦法,就是在列表中將大概率的音調(diào)名稱填寫得多一些,將小概率的音調(diào)名稱填寫得少一些,舉例來說,可以用圖3所示的這個二維的列表來代替轉(zhuǎn)移矩陣。

列表中的第一行,對應(yīng)的是g3這個音(也就是低音So)最可能出現(xiàn)的后續(xù)音符,從列表中可見,g3音后續(xù)更可能出現(xiàn)的是a3(低音La)或c4(中音Do),偶爾出現(xiàn)e4(中音Mi)和g3(低音So,也就是它自己),其他音不出現(xiàn)。這個列表是根據(jù)先前自由哼唱的大致結(jié)果填寫的,列表中音符出現(xiàn)多少的變化,就會決定音樂風(fēng)格的變化。這就意味著,只要“喂”給程序大量不同風(fēng)格的樂譜,程序就可以統(tǒng)計出不同風(fēng)格音樂旋律發(fā)展變化的概率,從而實現(xiàn)智能自動編曲。

第二行列表對應(yīng)的是a3這個音(也就是低音La)最可能出現(xiàn)的后續(xù)音符,第三行以及后面若干行以此類推。

用馬爾科夫鏈自動生成旋律的程序代碼也很簡短(如圖4),程序思路如下:先給出一個c4音(中音Do)加入到旋律列表中,然后,在二維列表中找出對應(yīng)c4音的后續(xù)音的那一行列表,然后隨機抽出某個后續(xù)音,加入到旋律列表中。運行程序可以發(fā)現(xiàn),生成的旋律果真比剛才好聽多了。若是有興趣再加上節(jié)奏變化和樂句間的停頓,就能自動創(chuàng)作出一首兒歌級別的音樂作品啦。

程序代碼中,稍顯難解的地方,其實就是根據(jù)前一個音符在二維列表中找出對應(yīng)的后續(xù)音符列表。但即便不使用二維列表,只用一維列表和If分支語句,也一樣能達到目標(biāo),只是代碼量稍微大一些而已。這樣一來,整個自動生成旋律的任務(wù),除了需要講解馬爾科夫鏈這個環(huán)節(jié),其他內(nèi)容都可以融入到日常的算法教學(xué)中。因此,日常的算法與程序語言的教學(xué),就成了人工智能教學(xué)的基礎(chǔ)鋪墊,而人工智能教學(xué)中的任務(wù),也就成了日常算法與程序語言的教學(xué)的驅(qū)動目標(biāo)。

猜你喜歡
作曲列表矩陣
Task 1
擴列吧
AI作曲的諾亞方舟將去往何處?
伍光輝作曲三首
多項式理論在矩陣求逆中的應(yīng)用
我的夢
列表法解分式方程問題探索
矩陣
矩陣
矩陣
福州市| 平顺县| 阿图什市| 金沙县| 仙游县| 长宁区| 柳林县| 天等县| 潮州市| 宁安市| 涪陵区| 嘉义县| 新河县| 和平区| 广昌县| 临朐县| 宜昌市| 临邑县| 通许县| 遂昌县| 邯郸市| 龙泉市| 门源| 玉田县| 普宁市| 吉林省| 遵义市| 郓城县| 泽普县| 江西省| 盐津县| 明星| 五原县| 临泉县| 竹山县| 祥云县| 彭阳县| 和田县| 镇远县| 乐至县| 沛县|