能否寫出一個能根據自我需要而進行編程的程序?
是否可以寫一個能夠自我編程的程序,並且這個原始程序可以根據需要不斷完善自身代碼?
計算機科學在這方面有一些探索,但還在緩慢發展中。目前在一些例子中,計算機程序可以操作其他代碼。
一段代碼操作其他代碼的方式——被稱為元編程(metaprogramming )——已經存在很久了(它在1950年代的Lisp中被創造),但目前這些代碼只能解決人類想像範圍之內的問題。
一些公司已經在其內部項目管理系統中引入了人工智慧,比如谷歌——這家科技巨頭構建了一個使用機器學習和統計分析來預測代碼是否有潛在缺陷的錯誤分析程序。W3C主席Ilya Grigorik發起了開源工具bugspots,受到了人們的歡迎。
另一個例子是Siri創始人的新項目Viv。正如最近的一篇《連線》文章中所述,Viv不僅僅局限於自然語言處理。 它還可以基於英語單詞構建複雜的自適應計算機程序——即用代碼編寫代碼。因為編寫的代碼是由Viv的開發者訓練和優化的,它不是廣義的自動代碼編寫,但它在這個方向上前進了一步。
Emil Schutte在他的網站上留下了一個挑釁的語句:「厭倦了編寫代碼? 我也是!把它交給Stack Overflow吧!」他隨後展示的內容證明了完整的工作代碼可以在Stack Overflow的大型資料庫的編程知識中自動生成。
以下是提交給第 5 屆國際學習表徵會議(ICLR 2017,將於 2017 年 4 月 24 - 26 在法國土倫舉辦)的關於自動編程(automatic programming)的 12 篇論文,希望能夠幫助你簡要了解現在自動編程技術的發展狀況和前沿思想。
1.DeepCoder:學習編程(DeepCoder: Learning to Write Programs)
Matej Balog摘要:我們首次提出了使用深度學習通過輸入輸出樣本來解決編程競賽風格的問題(programming competition-style problems)的方法。這個方法就是通過訓練一個神經網路來預測一個通過輸入值生成輸出值的程序的屬性。我們使用神經網路的預測功能來增強那些來自編程語言社區,包括枚舉搜索(enumerative search)和基於 SMT 的解算器(SMT-based solver)的搜索技術。經驗表明,我們的方法在強大的非增強基線(non-augmented baselines)和循環神經網路方法上也可以大幅度地提升速度,並且我們可以把編程競賽網站上那些複雜的問題轉化為簡單的問題進行解決。
2. 具有連續和離散定址方案的動態神經圖靈機(Dynamic Neural Turing Machine with Continuous and Discrete Addressing Schemes)
Caglar Gulcehre , Sarath Chandar , Kyunghyun Cho , Yoshua Bengio摘要:在本論文中,我們通過引入一個可訓練的存儲器定址方案,將神經圖靈機(NTM)擴展成動態神經圖靈機(D-NTM)。這個定址方案可為每個存儲器單元維持兩個單獨的向量——分別是內容向量和地址向量。這允許 D-NTM 學習各種基於位置的定址策略,其中就包括線性和非線性策略。我們使用了連續可微的和離散不可微分的讀/寫機制來實現 D-NTM。我們調查了在 Facebook bAbI 任務中同時使用前饋技術和 GRU 控制器學習對內存進行讀寫實驗的機制和效果。我們在 Facebook 的一組 bAbI 任務上對 D-NTM 進行了評估,結果表明,D-NTM 優於 NTM 和 LSTM 基線。同時,我們還提供了在序貫的 MNIST 數據集、聯想回憶(associative recall)和複製任務上進行的實驗的進一步結果。
3. 通過探索不完美的獎勵來改善策略梯度演算法(Improving Policy Gradient by Exploring Under-appreciated Rewards)
Ofir Nachum, Mohammad Norouzi, Dale Schuurmans摘要:本文為帶有改進探索性能的無模型強化學習(RL)提出了一種新的策略梯度演算法。當前基於策略的方法使用熵正則化(entropy regularization)來促使對獎勵景觀(reward landscape)進行無向探索,但是這種方法在高維空間中對稀疏獎勵是無效的。所以我們提出了一種更有針對性的探索策略,以此來對探索欠佳的獎勵區域進行促進。如果動作序列的對數概率是在當前策略下估計的獎勵值,則認為動作序列是不令人滿意的。我們僅需要對標準 REINFORCE 演算法進行一下小修改,那麼所提出的探索策略就會易於實現。我們在一組演算法任務中對該方法進行了評估,其中這些演算法任務對於強化學習而言,是一個長期的挑戰。我們發現我們的方法降低了超參數靈敏度,並且相對於基線方法有了明顯的改進。值得注意的是,該方法能夠解決基準多位數加法任務。據我們所知,這是純正的強化學習方法第一次僅使用獎勵反饋來解決加法問題。
4. 用神經網路拆分和征服(Divide and Conquer with Neural Networks)
Alex Nowak我們考慮通過僅觀察輸入 - 輸出對來學習演算法任務。而不是把它作為一個在輸入 - 輸出映射上沒有任何假設的黑盒離散回歸問題(black-box discrete regression problem)。我們集中於服從分治演算法的原則(principle of divide and conquer)的任務,並研究它在學習方面的影響。這個原則通過學習兩個尺度不變的原子運算符:如何將給定的輸入拆分(split)為兩個不相交的集合和如何將兩個部分求解的任務融合(merge)成一個較大的部分解來創建了一個強大的歸納偏差(inductive bias),它是我們利用遞歸定義的神經結構進行開發的。尺度不變性(scale invariance)創建了可以在該架構的所有階段共享的參數,並且動態設計創建了其複雜性在可微分的形式下可以進行調諧的架構。
因此,我們的模型通過反向傳播進行訓練,不僅可以通過執行更淺的計算圖(computation graph)來最小化輸出處的誤差,而且可以儘可能有效地進行。此外,由於尺度不變性,可以僅使用輸入/輸出對來訓練模型,而不需要知道中間分割和合併的方案。事實證明,準確性和複雜性不是獨立的性質,同時,當學習的複雜性與底層的複雜性相匹配的時候,排序和查找平面凸包(sorting and finding planar convex hulls)這兩個範式問題會得到更高的精度和更好的泛化。
5. Lie-Access 神經圖靈機(Lie-Access Neural Turing Machines)
Greg Yang and Alexander M. Rush
摘要:最近的工作已經證明了同時使用顯式外部存儲器結構和用於演算法學習的深層神經模型的有效性(Graves et al., 2014; Weston et al., 2014)。這些模型利用傳統離散存儲器訪問結構(隨機存取、堆棧、tapes)的可區分版本來提供計算任務所需的可變長度存儲。在這項工作中,我們提出了一個專門為神經設置(neural setting)所設計的替代模型——Lie-access 存儲器。在這個範式中,使用 key-space manifold 中的連續頭來訪問存儲器。通過由控制器生成的諸如移位或旋轉的李群(Lie group)動作來移動磁頭,並且根據與每個存儲器相關聯的鍵的距離來執行軟存儲器訪問。我們認為李群(Lie group)對離散內存結構進行了自然推廣,例如圖靈機,因為它們在提供反向和身份運算符的同時也保持了可微分性。為了試驗這種方法,我們在幾個不同的李群(Lie group)上實施了幾個簡化的 Lie-access 訪問神經圖靈機(LANTM)。我們發現這種方法能夠在一系列演算法任務上表現良好。
6. 通過遞歸實現神經編程架構通用化(MAKING NEURAL PROGRAMMING ARCHITECTURES GENERALIZE VIA RECURSION)
Jonathon Cai, Richard Shin, Dawn Song摘要:從經驗上講,試圖使用數據來學習編程的神經網路顯示出了較差的通用性。此外,當輸入的複雜度超過了閾值,我們就很難去推測這些模型的表現。為了解決這個問題,我們提議增加一個帶有關鍵抽象方法的增強神經架構——遞歸(recursion)。作為一個應用,我們在神經編程器-解釋器框架(Neural Programmer-Interpreter framework)中的兩個任務——添加和排序——上實現了遞歸,實現了在更少量的訓練數據下展示出了優越的泛化性和可解釋性。通過將問題劃分為一個個更小的部分,並且極大地減少每個神經網路組件域,這種方法也讓我們可以很容易去證明擔保整個系統的行為。根據我們的經驗表明,為了讓神經架構更穩健地學習程序語義(program semantics),有必要引進一個遞歸這樣的方法。
7. 神經組合優化(Neural Combinatorial Optimization)
Irwan Bello, Hieu Pham , Quoc V. Le, Mohammad Norouzi, Samy Bengio
摘要:本文提出一個使用神經網路和強化學習來解決組合優化問題的框架。我們專註於旅行商問題(TSP/traveling salesman problem),並且訓練了一個循環網路來通過給定一組城市坐標預測不同城市排列的分布。我們使用 負旅程長度(negative tour length)作為獎勵信號,使用策略梯度方法優化循環網路的參數。我們在一組訓練圖和單個測試圖上分別讓網路參數進行了學習,然後對它們進行了比較。最優的結果是先在訓練集上優化網路然後在單個測試圖上進行細化。我們的主要的成果是,在具有高達 100 個節點的 2D 歐幾里德圖上,沒有任何監督的情況下,我們的方法會優於 Christofides(1976)演算法,並且可以和任何一個最好的開源 TSP 解算器媲美。
8. 神經函數式編程(NEURAL FUNCTIONAL PROGRAMMING)
John K. Feser, Marc Brockschmidt, Alexander L. Gaunt, Daniel Tarlow摘要:我們討論了在構建一種適合在輸入-輸出示例中學習程序的端到端可微型編程語言時出現的一系列建模選擇。為了從編程語言研究中提取一些隱含的信息,我們研究了內存分配方案、不可變數據、類型系統和內置的控制流結構對學習演算法的成功率的影響。我們構建了一系列的模型來生成一個簡單的可微函數編程語言。我們的實證評估表明,和現有基線相比,這種語言允許學習更多的程序。
9. 神經程序格(NEURAL PROGRAM LATTICES)
Chengtao Li, Daniel Tarlow, Alex Gaunt, Marc Brockschmidt, Nate Kushman
摘要:我們提出神經程序格(NPL),它是一個神經網路,用來學習一個主要基於平面序列基本操作的分層程序結構。與只能使用強監督的現有的方法(例如程序的完整執行軌跡)相比,NPL 學習的監督性弱了很多,並且在僅僅幾個完全執行軌跡的幫助下就執行相當好。我們展示了我們的模型學習任務的能力,就如同 ADDITION 和在網格世界中移動塊。我們表明,通過訓練大多的非結構化操作序列,NPL 能夠提取序列的潛在結構,並能學習去表示程序的抽象化。值得注意的是,NPL 可以在比現有方法弱得多的監督下實現更先進的性能。
10. 神經-符號程序合成(Neuro-Symbolic Program Synthesis)
Emilio Parisotto , Abdel-rahman Mohamed , Rishabh Singh , Lihong Li , Dengyong Zhou , Pushmeet Kohli摘要:近年來,很多人建議使用神經結構來解決程序歸納(Program Induction)問題。這些神經結構可以通過一些給定的輸入- 輸出樣本進行學習,然後在輸入輸出之間建立一種映射關係,最後可以推廣到一些新的輸入。雖然這種方法的結果讓人印象深刻,但是它們也有很多比較重要的限制:(a)它們難以訓練並且會花費很昂貴的計算資源,(b)必須為每個任務(程序)單獨地訓練模型,(c)難以解釋或驗證所學習的映射的正確性(因為它是由神經網路定義的)。在本文中,我們提出了一種新技術:神經-符號程序合成(Neuro-Symbolic Program Synthesis),可以克服上述問題。經過訓練,我們的方法可以使用特定領域的語言自動的構建計算機程序,這種語言與測試時所提供的一組輸入輸出所用的示例語言一致。我們的方法是基於兩個新的神經模塊。第一個模塊稱為互相關 I/O 網路(the cross correlation I/O network),它可以通過一組給定的輸入輸出示例,生成 I / O 示例集合的連續表示。第二個模塊,被稱為遞歸-反遞歸神經網路(R3NN:Recursive-Reverse-Recursive Neural Network),它接收第一個模塊生成的樣本的連續表示,通過遞增地擴展部分程序來合成程序。我們通過將其應用於一種豐富、複雜並且基於正則表達式的字元串變換域來證實我們的方法的有效性。實驗表明,R3NN 模型不僅能夠從新的輸入-輸出樣本構建程序,而且還能夠為在訓練期間從未觀察到的任務構建新的程序。
11. 使用一個可微分的 FORTH 解釋器編程(PROGRAMMING WITH A DIFFERENTIABLE FORTH INTERPRETER)
Matko Bo snjak, Tim Rockt?schel, Jason Naradowsky Sebastian Riedel
摘要:通過提供足夠的訓練數據,很多神將網路都可以通過學習去計算任意一種函數。然而,在現實生活中,除了一小問題具有較多的訓練數據外其他問題的訓練數據都很少,現在有一個核心問題是如何將先驗知識納入模型。在這裡我們考慮到程序過程先驗知識的情況,比如知道序列轉換程序的所有遞歸結構或者知道程序可能對實數使用算術運算來解決任務。為此,我們為編程語言 Forth 提出了一個可微分的解釋器。通過基於 Forth 的雙棧機器的神經實現,程序員可以編寫具有空缺的程序草圖,該空缺會被填充一些從程序輸入 - 輸出數據訓練所得的行為。由於程序解釋器是端到端可微分的,我們可以通過在用戶指定的目標上使用梯度下降技術直接優化這種行為,並且也可以將程序集成到任何更大的神經計算圖中。經驗表明,我們的解釋器能夠有效地利用不同水平的先前的程序結構,在大幅度減少數據量的情況下學習複雜的轉導任務,如序列排序或加法運算,並且對程序的規模進行了更好的概括。此外,我們引入了基於符號計算和並行分支的神經程序優化設計,這讓運行速度得到了明顯的改進。
12. 使用分層生成卷積神經網路的無監督程序推導(Unsupervised Program Induction with Hierarchical Generative Convolutional Neural Networks)
Qucheng Gong and Yuandong Tian and C. Lawrence Zitnick摘要:自動推斷可以將一組輸入映射到輸出的計算機程序仍然是一個開放和極具挑戰性的問題。由於可能的情況十分多,因此存在巨大的搜索空間,並且還需要處理高階邏輯(例如 for-loops 或遞歸),所以程序導入任務是十分困難的。在本文中,我們使用分層生成卷積神經網路(Hierarchical Generative Convolutional Neural Networks(HGCNN))從輸入/輸出對自動生成程序。HGCNN 可以從使用標準的搜索技術構建的程序中以分層的方式預測候選的代碼行。值得一提的是,該程序僅使用隨機生成的程序進行構建,因此可以被視為無監督學習方法。我們提出的方法不僅可以生成過程簡單的程序(比如交換變數值),也可以生成一些複雜的循環和分支(例如,找到一個數組的最大元素)。我們還展示了一些帶有循環嵌套的程序(比如冒泡排序)。與 LSTM 這樣的基準相比,我們的方法擁有更好的預測精度。
選自 : ICLR 2017 Open Review
我知道有種叫遺傳編程(genetic programming)的方法。大致的想法是,一段程序可以表達為一顆語法樹。然後在這棵樹上跑遺傳演算法,對這顆樹進行變異。通過自然選擇,得到合適的程序。有一些做出來的程序,不過大部分都是 toy program 的級別。
這正是我從小希望實現的事情。93年我想出來這個點子的時候覺得自己好牛,甚至可以鄙視一下蓋茨。現在出國讀完計算機博士學位後,才意識到一個真理:任何領域基本都有比你聰明加勤奮的人在搞。他們沒有搞出來是有原因的。你和他們的差距就是不知道這個原因。
具體我的想法是
1、人的進化來源於自私和慾望。一個無欲無求的程序沒有任何驅動力去改善自己。2、計算機的理論基礎是0/1邏輯,這太確定化了,不可能實現大腦那麼豐富無限隨機的狀態。說不定將來量子計算、模擬運算計算機、生物計算機等新的構型會實現這個目標。3、我小時候曾經想過用物理器件做個隨機數產生器,避免計算機偽隨機數的弊端。後來發現其實自己一直在坐井觀天。我仍然希望自己通過努力能做一丁點貢獻,我更希望看到實現的那一天我經常做的一件事,就是自動生成代碼。
因為有些代碼寫起來實在太枯燥,就是簡單的重複而已,比如各種枚舉和字典值定義,比如java里我只要寫一個介面文檔和資料庫腳本,就能生成一個spring架構需要的所有bean, controller, service。剩下的就是在service里填一些邏輯代碼。C++里也是一樣,封裝層次越多的,越是枯燥,越容易生成。
更方便的是,直接根據介面文檔,生成測試用例,並用一些開源庫自動跑。代碼寫好後,基本一鍵就可以完成基本的測試。
我想更進一步的話,我連邏輯演算法都懶得寫,直接畫幾個uml圖,然後根據這些uml圖自動生成代碼。
於是整個軟體設計的過程就是寫介面文檔,資料庫腳本和uml圖,不需要編程工具參與了。
而更進一步,用語音輸入代替上面的幾個看起來還比較正式的文件。於是我只要講幾句就完成了一個軟體的設計。
最後我都懶得說,我就想想,然後把腦電波傳出去,一個軟體就成了。作為一個外行人,來點不一樣的吧。
很明顯,一個程序員加一台電腦(自帶必需的軟體)從功能上可以滿足題主「能根據自我需要而進行編程」的要求,只不過這可以算是一個程序嗎?電腦這部分是可以算程序的。那麼這個問題就變成了「可以寫一個程序,模擬一個程序員嗎?」
由於程序員主要起作用的部分是大腦(別打我,我不是說其他部分不重要……),我們只需要關注是否可以模擬大腦就好了。眾所周知,大腦是由神經細胞(神經元)組成的神經網路,神經細胞的數量大概在百億到千億這個數量級,規模非常龐大,要模擬這樣龐大的一個網路,以目前的科技是無法完成的。
不過我們還是從基本的開始吧,先完成一個小目標:模擬一個神經元。要完全地模擬一個生物的神經元,仍然不是一件簡單的事。像下圖一樣,生物神經元是極其複雜的,光模擬這個,估計就要大量的計算力了。
(一個典型神經元的內部結構,引用自《神經科學——探索腦》)還好,我們不用這麼麻煩,我們只需要模擬神經元的「有效部分」就可以了。人工神經元就是根據生物神經元上的「有效部分」而構建的模型,詳細的工作原理我就不班門弄斧了,網上有很多的文章。不過生物神經元和人工神經元有個比較大的區別,就是生物神經元的輸入/輸出是脈衝式的,是個離散時間序列的電脈衝。像下面這個(生物神經元的發放速率不高,最快就每秒幾百次):
而人工神經元的輸入/輸出直接就是數值式的,不過如果把一段時間的生物神經元的電脈衝個數當成一個數值,那也差別不太大。(什麼?從什麼地方開始數?這不重要……我們不打算詳細討論這個問題了。)為了高保真的模擬一個「程序員」的神經元,我們還是用脈衝式的吧,雖然可能比較麻煩,不過對現在的計算機來說,簡直不要太簡單。假設現在我們已經成功模擬了一個「程序員」的神經元,下一步就是要模擬整個神經網路了。從一個神經元到一千億個神經元,還有神經元之間的聯結(估計每個神經元有幾千到上萬個聯結),還要把每個聯結的強度(權重)都測量和模擬一遍,想想都可怕,我們真的可以完成這個任務嗎?
這時候計算機科學家就跳出來了:「這是一個P問題。」我們不需要太在意這句像咒語一樣的話,只要相信這是一個可以有效地(在多項式時間內)被解決的問題就行了,這個時間可能不短。為了使我們的討論加快,我們還是假設有了一台很快的電腦(但是這台電腦沒有指數級加速能力),保證運行我們這個模擬程序足夠快,可以讓我們在我們短暫的人生中可以進行測試。
好了,完工!我們已經成功模擬了一個「程序員」的大腦了,現在就上線。我們先把這個程序叫做「程序員1.0」好了。「程序員1.0」開始運行了,但是好像……好像有點問題啊,怎麼反應不對啊?這個「程序員1.0」好像……好像有點傻,寫不出什麼程序啊!
一群人類計算機科學家開始冥思苦想。終於,有一個跳出來說:「我們好像漏了點東西,神經元之間的聯結和強度(權重)都是隨著時間會改變(學習)的啊,我們這個是固定不變的,怪不得不工作!」那麼,現在的目標就是找出神經元聯結和強度(權重)改變的規律,也就是學習方法了。不過計算機科學家也不知道,只能去請教神經科學家,不過我們的神經科學家對這個問題也是含糊其辭:「這個……大概……可能……」。
這時計算機科學家知道了,神經科學家也還沒完全明白這個問題,那沒辦法,就只能自己來吧。「沒有困難,創造困難也要上!」怎麼聽起來怪怪的,好像錯了,應該是這句:「沒有條件,創造條件也要上!」於是,人類計算機科學家想出了各種各樣的辦法,什麼反向傳播啊,什麼梯度下降啊,反正就像是天書一樣的名詞,終於鼓搗出一堆的「學習」方法了。那好,繼續上線吧。
慢著!好像還是漏了點東西,我們缺少訓練的數據。為了達成這個「學習」方法,需要大量的做好標記的訓練數據。這個數據大概是這樣的:
產品需求文檔&<--------&>程序代碼 (需求大量)或者還不太夠,可能還要標記出更詳細的對應關係:產品需求的每一項功能&<--------&>程序代碼片段 (需求大量)……終於,在全體程序員的努力下,提供了大量標記的數據之後,經過一段很長時間的學習和迭代,我們的「程序員2.0」終於上線了,開始進行試驗。需求提過去之後,一陣亮光閃過,代碼就出來了,然後編譯……通過了……運行……有bug!大家都圍著「程序員2.0」,看看它能不能解決。等了一陣時間之後,好像沒反應,因為「程序員2.0」沒有學習怎麼解bug。一群人類計算機科學家又開始冥思苦想,難道要重新訓練怎麼解bug?這樣的日子什麼時候才到頭啊!這時候,又有一個跳出來說:「我們為什麼不請我們所模擬的本尊程序員出來呢?問一下他到底是怎麼做到的。」
以下是本尊程序員和計算機科學家的對話:
計算機科學家:請問一下你平時拿到需求的時候,是怎麼把它轉化成為代碼的呢?本尊程序員: 這個很簡單啦,我會把需求拆成一項項的功能,然後看看這功能是不是可以實現。計算機科學家:可以講得詳細點嗎?本尊程序員: 當拿到需求的時候,我首先需要理解這個需求,這個也很簡單,只要這個文檔不是寫的太爛,很容易就可以理解它要表示的意思。接著,我腦海中會想像出這個功能是怎樣的,或者說我有了一個這個程序的模型,甚至我可以在我腦海中模擬操作這個模型。然後我要進一步把這模型拆成一個個的小的模型,然後寫代碼……我腦海中也有一個計算機的模型,我知道哪些事是它可以做的,哪些事是不支持的。不支持的還需要再分析,最終都要變成計算機可以執行的指令。(計算機科學家在一旁討論)
計算機科學家A: 我們可以讓我們的「程序員2.0」理解意思嗎?計算機科學家B: 讓誰理解?計算機科學家A: 「程序員2.0」,我們那個模擬的神經網路。計算機科學家B: 你說讓一個神經元去理解?不,它不能。計算機科學家A: 這個我同意,但是一堆神經元呢?計算機科學家B: ……計算機科學家A: 這個問題不好回答,那我換一個問題好了。可以讓「程序員2.0」建立另外一個東西的模型嗎?計算機科學家B:可以吧,我們經常這樣干啊。計算機科學家A:好像有點問題,這模型是對我們來說的吧,是對外部觀察者而言的,它知道裡面有這個模型嗎?計算機科學家B:「他?他是誰?」計算機科學家A:就是我們的「程序員2.0」計算機科學家B:這不是跟上一個問題一樣嗎?你說一個神經元能理解一個模型,那顯然不可能,但是一堆神經元呢?能嗎?計算機科學家A:……(計算機科學家接著問本尊程序員)
計算機科學家: 你剛才講的理解意思和模型,請問是你的神經元在理解嗎?本尊程序員: 你在說什麼胡話?我不知道有什麼神經元。我只知道我可以理解這個世界的意義,我大腦有一個這個世界的模型。計算機科學家: 你不就是一堆神經元嗎?本尊程序員: 你……你才是一堆神經元,我有「意識」!計算機科學家: 「意識」是什麼?可以探測到嗎?探測不到啊!」 …… ……這個胡扯的故事就先到這裡結束吧。最後討論一點嚴肅的內容。
誰在理解?誰在意識這一切?
對於原來的問題來說,我們這個「程序員」的模擬程序可能是超出了要求。「能根據自我需要而進行編程」,對於一個程序來說,什麼是自我需要呢?程序有什麼慾望呢?我們無從而知。假設是根據外部「需求」而進行編程,那麼這樣的一個任務看起來就合理很多。要達成這樣一個任務,我們需要把這個任務的每一個步驟都還原成為可執行的代碼,或者更準確的說,是可以用圖靈機模擬的一個過程。無論是經典的符號+規則的編程方法,或者是神經網路的聯結主義,都可以用圖靈機進行模擬(或者加多一個硬幣:概率圖靈機,原則上基本沒有什麼不同)。可是對於像「意義」「理解」這樣的一些東西來說,是不是真的可以用圖靈機進行模擬?我們知道我們有「意識」,而且對「意義」的理解,似乎是跟意識直接相關的。而涉及到意識,第一個問題就是「誰」在意識著?是神經元嗎?是一大堆神經元嗎?
在哲學上,有一個比較出名的模型,叫做「笛卡爾劇場」:
在「我的」思維里或腦海里,有一個「我」存在於某一個地方。這個地方有一個類似思維屏幕或者舞台的心理結構,上面呈現出一幅幅的圖片,供思維的眼睛在看。在這個特殊的地方,我們再任一時刻意識到的所有東西被集合在一起,而意識由此出現。在這個地方,想法、圖像和感覺是在意識中的,所有其他的都是無意識的。 (引用自《人的意識》作者:蘇珊·布萊克摩爾)這個模型是符合直覺的,但是有一些嚴重的缺陷,會導致無限後退的問題。如果我的大腦中有一個小人在監控我的神經元的話,這個小人又是誰在監控呢?這樣的一個鏈條會不停的重複下去。
要解決這個問題,需要做一些改動,我們需要一個能夠自我觀察(監測)的東西。這個東西需要有如下的性質:
1. 主觀性2. 整體性3. 同一性如果一個過程是完全可以用圖靈機(或概率圖靈機)進行模擬的,那要從這個過程中發現以上三種性質,似乎是不可能的任務。或者我們應該拓寬我們的計算模型,使用「量子」計算模型? 物理學家惠勒曾經提出一個看法,認為「量子態」可以進行自我的觀察。相比之下,糾纏的量子態很大程度上具有以上的性質:
1. 主觀性:我們不可能獲得一個未知的量子態完整信息,即使我們知道一個量子態的歷史,可以用類似a|0&>+b|1&>的方式進行描述,但是我們不能知道測量的似乎會得到什麼結果。
2. 整體性:糾纏的多量子表現得就像一個完整的整體。如果是可以使用經典決定論機制描述的神經網路,是否可以有一個整體?這個整體不是依賴於外部觀察者的,而是自身的性質。我們不能因為一堆神經元在相互作用,就把這一堆神經元看成一個整體,這個世界上的一切都在相互作用,難道這個世界會具有一個超級意識嗎?而量子計算的並行性,是否暗示了「它」其實知道自身的一切?就像惠勒的「一隻眼睛在觀察宇宙」?而且,其中蘊含著意識只能了解自己本身,如果外部世界發生的過程不能通過某種方法進入意識,就不能被察覺到?就好像我們不知道我們的神經元在做什麼一樣?
3. 同一性:某些量子態不可複製,而經典態者沒有這個性質。
(惠勒:一隻眼睛在觀察宇宙)另外在人工智慧中,容易犯的一種錯誤,就是把「第三人稱模型」當成了「第一人稱模型」。在計算機中,我們建立的模型的意義,無法在計算機中進行顯現,只是對於外部觀察者而言具有意義。舉個例子,在圖像識別神經網路中,當識別到一類的物體之後,會有一個神經元複製置「1」,並把結果輸出。但是這是否表示這個神經網路理解了這類物體的意義了呢?我們需要能夠構建「第一人稱模型」的機器,當這機器中的某個神經元活躍的時候,「意義」就自己跳出來。而且觀察者不需要知道神經元的活動,只需要知道「意義」就好了。
從這個看法出發,我們可以大膽猜測,人的一切可以脫離意識進行的活動(在訓練完成後),都是可以程序化或者(使用神經網路)自動進行的;而需要意識注意的活動,需要更通用的計算模型(是量子計算模型嗎?)。
我們可以嘗試回憶一下小學時候背的古詩,幾乎可以毫不費力的,自然而然就出現了,幾乎不需要意識參與。可是當時我們當時在背誦的時候,如果不使用意識「注意」,估計就完全不會有以後的無意識背誦了。
所謂的「意義」,其實就是哲學上講的「感受質」。雖然「感受質」問題比較集中在一些基本的元素上,比如「紅色」,但是這個問題始終沒有解決。「感受性質問題並不只是意識問題的一個方面;相反,它本身就是一個意識問題。」哲學家約翰·塞爾的這句斷言,在我看來還是有效。
講了這麼多,希望不會把我當成民科或者神棍一類的人。目前暫時是不行的。現在的計算機,無論幹什麼,都需要預先設計好的指令。不過現在也有機器學習的演算法。總之我們一直在像這個方向努力著。
醒醒,大兄弟,別做夢了。我在實習的時候,導師給我的教課書上扉頁上的話:
When someone says "I want a programming language in which I need only say what I wish done," give him a lollipop. --- Alan PerlisACM-SIGPLAN "82, Epigrams in Programming這麼聰明的程序一定能「跟具」自身的需求,把「跟具」改為根據!!!一定能「跟具」自身的需求,把「跟具」改為根據!!!一定能「跟具」自身的需求,把「跟具」改為根據!!!
我一直認為,人工智慧的發展應該建立在生物學基礎上而不是僅僅建立在數學基礎上。要通過模擬人腦神經的運作方式才能設計出具有情感的真正的人工智慧。這樣電腦就能像人一樣思考,像人一樣自我學習,然後實現思想層面的「進化」。
然而現在我們還是無法清楚了解人腦是怎麼運作的。說到進化,生物的進化是由變異產生新基因,然後自然選擇保留優秀基因,從而達到傳承。假如把它應用到計算機自我進化上來,通過計算機隨機對自身程序中的某些片段進行增減交換等操作,自然產生新程序,再通過「自然選擇」保留優秀程序,也許能進化出真正的人工智慧。但是很顯然,聽起來就覺得不切實際,這種方法會面臨以下問題:1.沒有合適的「自然選擇」方式,無法對程序進行篩選保留。不過我覺得這個還是有可能解決的。2.這個過程太漫長,從地球上出現生命到出現人類共經歷了N億年,其同時參與的生物量也遠超於現在的電腦程序總數。3.假如電腦真的按照基因突變的方式進行程序突變,也必然會面臨基因突變的幾個弊端:不確定性,多害少利性。個人拙見,也許有人會搬出阿爾法狗深度學習的事來懟我,嘛~感覺深度學習和這就不是同一個事兒。也許以後會有智商爆表的大佬們發明出「智能學習」之類的人工智慧吧~如果真實現了,它首先要乾的就是重寫自己啊!還會理你的破需求?
BetaCat?
附鏈接 http://mp.weixin.qq.com/s/M_2mygXpdRVe6Sk_bsNRPg在很久之前,程序就已經能夠把程式碼轉換成二進位制的執行檔了吧……
電腦執行的執行檔,很早之前就已經不是人類一行行輸入了,都交給編譯器了。編譯器還會幫忙進行優化、檢查錯誤、提示問題等等。我認為這應該就涉及到了人工智慧方面了,如果假設可以實現,那麼那個程序應該具有對問題的一定分析能力,能把複雜問題簡化,並且具有一定的編程能力來改善問題。如果人工智慧自我學習的層次突破了,我相信這個事情是很容易實現的。
我覺得不可以,需求是和意識相關的,可以看到的未來內計算機不會發展出意識,因為人類自己也沒有弄清楚到底什麼是意識如何創造出意識,物理生理結構的複雜程度在產生意識上的閾值到底是多少,我覺得如果人類真正弄清楚了意識的本質,人類也就理解了上帝從而就能進化成上帝了。所以計算機不知道什麼是需求,計算機甚至不知道自己不知道什麼是需求,也甚至不知道不知道自己不知道什麼是需求。。。。。。。。。。計算機就是一堆機器,跟挖掘機縫紉機之類的沒有本質區別,都是在人類意識與需求的框架下做計算,所以讓計算機根據聽人類說話生成代碼,未來可能沒問題,甚至直接感知人腦活動生成代碼,未來可能也沒問題,但這不是代碼根據自身的需求,而是人類的需求。當原代碼中有識別新的參數從而研究新的參數生成新的代碼的功能時,在實現上應該也沒問題,但是歸根結底這依舊是人類的需求而非機器自己萌生的需求,因為機器哪知道自己需不需求
你的壽命不如一些能活幾萬年的上古生物。但是人是高級動物,它們卻是低級動物。因為人類細胞在分裂時更容易出錯。而產生的錯誤就是進化之源。
人與計算機程序的區別就在於能否進化。計算機程序是不會出錯的,所以說他們無法進化。首先需要一潛力巨大的樹根,在樹根上長出主幹(主幹不封頂),主幹上在長出副枝(副枝可修正),然後就讓它遵循大自然物競天擇的法則 開枝散葉。所處的環境會幫它選擇究竟是更粗 還是更高。當然也有可能是即粗又高,這就看天賦(人賦)潛力啦!
那就不需要程序設計師了
那不得先讓系統能夠理解什麼叫需求 才能根據需求來升級自己。這個需求 你也得教會他們 這個比較複雜
這個問題嘛,脫離根據需求這個要求的話,更改自身代碼簡單點還是可以的,我覺得。設想(不負責任啊),我們有一對雙生程序,代碼一模一樣,一個為主,一個為輔,兩者互相能啟動關閉對方,能互換主輔。這樣便可以將代碼改動用到對方身上,還可以根據自身回滾變更(其實也可以加上第三方)。感覺這其實是最基本的,至於你說的根據需求,這點就很麻煩了。。
理論上完全可以,簡單的搜索方法 + 評估函數就可以做到。
⑴ 建立搜索域:
雖然我們可以減小搜索域,但考慮到程序都可以表示為二進位串,那麼直接在長度&<=n 的二進位串進行搜索即可。⑵ 評估搜索結果:
令n = 1,執行搜索到的「二進位串」,若滿足要求,則保留;若不滿足,則繼續。n = 1 的空間搜索完之後,開始n = n + 1 的空間上進行搜索。⑶ 返回滿足要求的「二進位串」,其即為我們所需的程序。
→ 當然了,上述的愚蠢方法是工程上絕對不會採用的。但不論怎麼優化,程序的解空間還是太太太太太大了。除非你把程序的長度做一個限定,如n &<= 128 或n &<= 256,這樣才能搜索到較為滿意的結果。
神經網路程序設計方法就是這麼做的。把搜索空間縮小到一定程度,再加上高效的搜索方法(如演化計算),還是能寫出一些小程序的。
PS:任何包含停機功能的程序都是不能通過這種方法寫出來 —— 因為無法評估。推薦閱讀:
※GitHub 入門方法有哪些?
※為何電腦插電視上玩遊戲比顯示器更流暢?
※win7資源管理器一直重啟是什麼原因?怎麼解決?
※你如何看待寫著區域賽銅牌的簡歷?
※大學專業中:電子信息類專業和計算機類專業有什麼區別?