起源于上世紀五、六十年代就提出人工智能的概念了,當時叫感知機(perceptron),擁有輸入層、輸出層和一個隱含層。輸入的特征向量通過隱含層變換達到輸出層,在輸出層得到分類結果,當時的人們對此非常樂觀,號稱要在10年內解決所有的問題。但是,單層感知機有一個嚴重得不能再嚴重的問題,即它對稍復雜一些的函數都無能為力(比如最為典型的“異或”邏輯),連異或都不能擬合。當時有一個專家叫明斯基,號稱人工智能之父,在一次行業大會上公開承認,人工智能連一些基本的邏輯運算(比如異或運算)都無能為力,于是政府所有的資助全部都停掉了,于是進入人工智能的第一個冬天。
隨著數學的發展,這個缺點直到上世紀八十年代才發明了多層感知機克服,同時也提出了梯度下降、誤差反向傳播(BP)算法等當前深度學習中非常基礎的算法。之前被人詬病的問題已經被解決了,希望的小火苗又重新點燃了,于是人工智能開始再次興起。
但是沒過多久大家發現了,雖然理論模型是完善了,但是并沒有實際用途,還不能解決實際問題,于是又冷下去了,人工智能的第二個冬天降臨。
下面我們就來第三次熱潮是如何興起的。
在這之前,我們先介紹一個比賽。這個比賽是一項圖像識別的挑戰賽,給你大量圖片去做圖像識別,比賽看誰的識別錯誤低。在2012年之前,錯誤率降低到30%以后,再往下降就很難了,每年只能下降個2,3個百分點。
直到2012年,有一個哥們叫Alex,這哥們在寢室用GPU死磕了一個卷積神經網絡的模型,將識別錯誤率從26%下降到了16%,下降了10%左右,一舉震驚了整個人工智能界,當之無愧的獲得了當年的冠軍。
從此之后,卷積神經網絡一炮而紅。之后每年挑戰賽的冠軍,勝者都是利用卷積神經網絡來訓練的。2015年,挑戰賽的錯誤率已經降低到3.5%附近,而在同樣的圖像識別的任務,人眼的辨識錯誤率大概在5.1%,也就是目前的深度學習模型的識別能力已經超過了人眼。
下圖是最近幾年比較有代表性的模型的架構。
大家可以看出來,深度學習的模型的發展規律,深,更深。沒有最深,只有更深。
那么Alex的卷積神經網絡這么厲害,是因為這個哥們是個學術大牛,有什么獨創性的學術研究成果么?
其實并不是。
他所采用的模型是1998年Yann Lecun就提出了這個模型,當時Yann Lecun把這個模型應用在識別手寫郵編數字的識別上,取得了很好的效果,他搭建的網絡,命名為Lenet。這個人的名字——Yann Lecun,大家一定要記住,因為我們后面的內容將會以Lenet作為范本來講解。
這個模型是1998年提出來的,可為什么時隔這么多年才開始火起來呢?
人工智能突然爆發背后深層次的原因是什么?我總結了一下,背后的原因主要有三個:
1.算法的成熟,尤其是隨機梯度下降的方法的優化,以及一些能夠有效防止過擬合的算法的提出,至于什么是隨機梯度下降和過擬合,后面我們會詳細講到
2.數據獲取,互聯網的爆發,尤其是移動互聯網和社交網絡的普及,可以比較容易的獲取大量的互聯網資源,尤其是圖片和視頻資源,因為做深度學習訓練的時候需要大量的數據。
3.計算能力的提升,因為要訓練的數據量很大(都是百萬級以上的數據),而且訓練的參數也很大(有的比較深的模型有幾百萬甚至上千萬個的參數需要同時優化),而多虧了摩爾定律,能夠以較低的價格獲取強大的運算能力,也多虧了Nvida,開發了GPU這個神器,可以大幅降低訓練時間。
GPU的運算速度是CPU的5-10倍左右,同樣的模型需要訓練,如果用CPU訓練需要一個禮拜的話,那使用GPU,只需要一天時間就可以了。
截止到目前,我們匯總下我們的學習內容,我們了解了人工智能的簡單介紹,大致了解了人工智能的算法分類以及發展歷史。
深度學習基礎知識
接下來我們了解一下基礎知識。
我們上面也提到了,我們這次主要以卷積神經網絡在圖像識別領域的應用來介紹深度學習的。
卷積神經網絡,這個詞聽起來非常深奧。
但其實沒什么復雜的,我們可以分開成兩個詞來理解,卷積和神經網絡。
先看下卷積。
卷積時數學的定義,在數學里是有明確的公式定義的。
是不是覺得公式太抽象,看不明白?沒關系,我們舉個栗子就明白了。
還是以圖像識別為例,我們看到的圖像其實是由一個個像素點構成的。
一般彩色圖像的是RGB格式的,也就是每個像素點的顏色,都是有RGB(紅綠藍三原色混合而成的),是三個值綜合的表現。
假設f函數為5x5(對應到圖片上即為5x5像素)為例,h函數為3x3的函數,大家可以理解為為一個手電筒(也就是篩選器),依次掃過這個5x5的區間。在照過一個區域,就像對應區域里的值就和框里的數據去做運算。最終輸出為我們的輸出圖。
手電筒本身是一個函數,在3x3的區域內,他在每個位置都有參數,它的參數和對應到圖片上相應位置的數字,先相乘,然后再把相乘的數字相加的結果輸出,依次按照這些去把整個圖片全部篩選一遍,就是我們所說的卷積運算了。
還是比較抽象,沒關系,看下面這個圖片就清楚了。
那我們為什么要做卷積呢?我們其實就是建立一個輸入和輸出的函數,圖像識別的目的就是把輸入的信息(像素點信息)對應到我們輸出結果(識別類別)上去,所以是逐層提取有用特征,去除無用信息的過程。
比如下圖所示,第一層可以識別一些邊緣信息,后面逐層抽象,匯總到最后,就可以輸出我們想要的結果,也就是我們的識別結果。
雖然我們知道特征是逐層抽象提取的,但是不幸的是,我們并不知道那一層是具體做什么的,也就不知道那個層數具體是什么意思。
也就是說,其實深度學習網絡對于我們而言,是個黑盒子,我們只能通過他的輸出來判斷其好壞,而不能直接去調整某個參數。
那么,什么是神經網絡呢?其實這個模型來自于心理學和神經學,人工智能的專家借鑒了這個結構。
左側為神經元,神經元接收外界的輸入刺激或者其他神經元的傳遞過來的信號,經過處理,傳遞給外界或者給其他神經元。
右側為我們根據神經元的生物學特征抽象出來的數學模型,其中x是輸入,包括一開始數據來源(外部刺激)的輸入,也包括其他節點(神經元)的輸入。
w為參數(weight),每個節點還有一個b,這個b其實是一個偏置。
大家在學習新東西的時候,凡事多問個為什么?只有知道背后的原因了,這樣你才能理解的更深刻。有句話說得好,還有什么比帶著問題學習更有效率的學習方法呢?
為什么要加這個b呢?大家想想看,如果沒有b的話,當輸入x為0的時候,輸出全部為0,這是我們不想看到的。所以要加上這個b,引入更多的參數,帶來更大的優化空間。
大家看一下,目前為止,這個神經元里的函數(對輸入信號的處理)都還是線性的,也就是說輸出與輸入是線性相關的,但是根據神經元的生物學研究,發現其接受到的刺激與輸入并不是線性相關的,也為了能夠表征一些非線性函數,所以必須要再引入一個函數,也就是下面我們要講的激活函數(activation function)。
為什么需要激活函數?因為需要引入一些非線性的特性在里面。
常見的激活函數有這些。
以前是sigmoid比較常見,但是現在ReLU用的比較多一些。
就類似于下圖這樣,在節點經過線性運算后,經過非線性的ReLU,然后進入下一層的下一個節點。中間的w和b,就是我們卷積神經網絡的參數,也是我們模型中需要訓練的對象。
大家看LeNet模型中,就是在輸入數據多次進行卷積神經網絡的處理。
對于模型而已,我們習慣把輸入的數據叫做輸入層,中間的網絡叫做隱藏層,輸出的結果叫做輸出層。中間層數越多,模型越復雜,所需要訓練的參數也就越多。
所謂的deep learning中的deep,指的就是中間層的層數,右圖中GoogLenet有22層。
一般說來,模型越復雜,所能實現的功能也越強大,所能達到的精度也越高,目前最深的模型大概有10的7次方個神經元,其神經元比相對原始的脊椎動物如青蛙的神經系統還要小。
自從引入隱藏單元,人工神經網絡的大小大約每 2.4 年翻一倍,按照現在的發展速度,大概要到2050年左右才能達到人類大腦的神經元數量的規模。
損失函數
怎么判斷一個模型訓練的好壞呢?我們需要一個評價指標(也就是KPI考核指標),也就是損失函數。
我們最初的目標是什么?是建立輸入輸出的映射關系。
比如我們的目標是判斷一張圖片上是只貓,還是一棵樹。那這張圖片上所有的像素點就是輸入,而判斷結果就是輸出。
那怎么表征這個模型的好壞呢?很簡單,大家應該很容易想到,就是把模型輸出的答案和正確答案做一下比對,看一下相差多少。
我們一般用下面這個公式(平均平方誤差,即MSE)來評估我們的模型好壞。
我們就是通過對比輸出結果與預期結果的差異,其中帶帽子的yu就是預期的結果(也就是標簽值,即是真值),而前面的不帶帽子的yu就是實際的輸出結果。當訓練結果非常好的時候,比如說是全對的時候,平均誤差就是0。當訓練結果非常差的時候,比如說全錯的時候,誤差即為1.
于是我們知道了,這個E越小越好,最好變成0.
大家注意下,這個求和的標識,表示是所有的數據的和,而不是一個的數值。我們常說大數據來訓練模型,其實這就是大數據。我們訓練的時候需要上百萬張的圖片,最終得出來的誤差,就是這里,然后再除以數量,取平均值。
那怎么去降低這個誤差呢?要回答這個問題,就涉及到卷積神經網絡的核心思想了,也就是反向傳播。
反向傳播/梯度下降
既然講到機器學習,那當然是讓機器自己去通過數據去學習,那機器是如何進行自學習的呢?下面就要敲黑板,劃重點了,因為這就是深度學習的重中之重了,也就是機器學習的核心了,理解了這個概念,基本上就理解了一多半了。
這個概念就是反向傳播。聽名字比較玄乎,其實這個概念大家在高等數學里都接觸過這個概念了——梯度,其實也就是求導。
對于一維函數而言,函數梯度下降的方向就是導數的反方向。
對于二維函數而言,就是把誤差對每個變量求偏導,偏導的反方向即為梯度下降的方向。
說起來有點抽象,我們舉個實例來說明一下。
下面是我們的參數和損失函數的值。
我們先對第一個參數加一個極小值,算出新的損失函數。
然后用損失函數的變化去除這個極小值,就是這個參數的梯度了。
同樣我們可以使用同樣的方法去求得其他參數的梯度。
只要找到梯度下降的方向,按照方向去優化這些參數就好了。這個概念就是梯度下降。
但是我們知道,我們要訓練的參數非常多,數據量也非常大,經常是百萬、千萬量級的,如果每次都把全部訓練數據都重新計算一遍,計算損失函數,然后再反向傳播,計算梯度,這樣下去,模型的誤差優化的非常非常慢。
那有沒有更快的方法呢?
當然有了。
這些參數(weights),數量非常多,大概有上百萬個,為了保證能夠更好、更快的計算,節省算力,一般選用隨機梯度下降方法,隨機抽取一定數量(即為批量,batch)的樣本,去計算梯度值,一般選擇32/64/128。
這個方法就是隨機梯度下降,這個批量(batch)這也是大家經常要調的參數。
我們可以這樣理解隨機梯度下降,其核心思想是,梯度是期望。期望可使用小規模的樣本近似估計。具體而言,在算法的每一步,我們從訓練集中均勻抽出小批量樣本來代替全部數據的梯度,因為其梯度期望是一致的。
值得一提是:這些batch中的樣本,必須是隨機抽取的,否則其期望就準確了。選的批量(batch)的值越小,進行一次參數優化的計算量越小,就越快,但是其隨機性會比較大一些,如果選取的批量值比較大,則計算會稍微慢一些,但是隨機性會小一些,這是我們需要權衡的。
前向計算一次,反向反饋一下,更新一下參數,叫做一個Epoch.
Epoch的次數也是個超參數,也是需要搭建模型的時候可以調整的參數。
在整個模型中也是類似的。
簡單總結下,截止到目前,我們已經了解了一些深度學習的基本概念,比如什么是卷積神經網絡,了解了反向傳播的傳播的概念,如何梯度下降的方法去優化誤差。
基本上深度學習是什么回事,大家已經知道了,但是深度學習還需要注意一些細節。有句話說的好,細節就是魔鬼,細節處理的好壞很大程度上決定了你是一個高手,還是一個菜鳥。
深度學習之高手進階
我們在進行深度學習的時候一般會按照這4個步驟進行。
獲取數據
很大程度上,數據的多少決定模型所能達到的精度。再好的模型,沒有足夠數據,也是白瞎。
對于監督學習而言,需要大量標定的數據。
數據的獲取是有成本的,尤其是我們需要的數據都是百萬、千萬量級的,成本非常高。亞馬遜有個專門發布標定任務的平臺,叫做Amazon MechanicalTurk.
很多大的數據,比如IMAGENET就是在這上面做label的。
Amazon從中抽取20%的費用,也就是說,需求方發布100美元的任務,得多交20美元給Amazon,躺著也掙錢。
由于數據的獲取是有成本的,而且成本很高的。
所以我們需要以盡量低的價格去獲得更多的數據,所以,在已經獲得數據基礎上,僅僅通過軟件處理去擴展數據,就是非常重要的。
數據預處理-歸一化
為了更好的計算數據,避免出現太大或者太小的數據,從而出現計算溢出或者精度失真,一般在開始做數據處理之前,需要進行歸一化處理,就是將像素保持在合理的范圍內,如[0,1]或者[-1,1]。
模型搭建
除了上面提到的卷積神經網絡之外,我們在搭建模型的時候,還需要一些其他層,最常見的是輸出控制。
全連接層Fully-connected
全連接層,其字面意思就是將每個輸入值和每個輸出值都連接起來,全連接層的目的其實就是控制輸出數量。
比如我們最終分類是有10類,那我們需要把輸出控制為10個,那就需要一個全連接層來鏈接輸出層。
softmax
我們用數值來表征其可能性大小,數值越大,其可能性越大,有的值可能很大,有的值可能很小,是負的。
怎么用概率來表征其可能性呢?總不能加起來一除吧,但是有負數怎么辦呢?全連接之后,我們每個類別得到一個值,那怎么轉化表征其可能性的概率呢?我們一般通過softmax來轉化。
獨熱編碼 One-Hot Encoding
獨熱編碼,又叫做一位有效編碼
有多少標簽,就轉化為多少行的單列矩陣,其本質就是將連續值轉化為離散值。
這樣可以直接直接將輸出值直接輸出,得到一個唯一值。
就像一個篩子,只留一個最大值,其他全部篩掉。
客觀評價——交叉驗證
講完輸出控制,我們再講一下評價方法。
我們有一些數據,希望利用現有的數據去訓練模型,同時利用這些數據去評價這個模型的好壞,也就是我們需要知道,這個模型的準確率是50%,還是90%,還是99%?
具體怎么去做呢?
最先想到的是,用全部的數據去訓練,然后評價的時候,從中抽取一定數量的樣本去做驗證。這不是很簡單嘛?
但是,這樣不行。
想像一下,在高考考場上,你打開試卷,看了一眼之后高興壞了。因為你發現這些試題你之前做練習的時候都做過。
其實是一個道理。如果拿訓練過的數據去做驗證,那得到的誤差率會比實際的誤差率要低得多,也就失去了意義。
那怎么辦呢?我們需要把訓練數據和最終評價的數據(也就是驗證數據)要分開。這樣才能保證你驗證的時候看的是全新的數據,才能保證得到的結果是客觀可靠地結果。所以我們會得到兩個誤差率,一個是訓練集的誤差率,一個是驗證集的誤差率,記住這兩個誤差率,后面會用到。
拿到數據的第一步,先把所有的數據隨機分成兩部分:訓練集和驗證集。一般而言,訓練集占總數據的80%左右,驗證集占20%左右。
訓練的時候,隨機從訓練集中抽取一個批量的數據,去訓練,也就是一次正向傳播和一次反向傳播。
這一輪做完之后,從驗證集里隨機抽取一定數量來評價下其誤差率。
每做一輪學習,一次正向傳播一次反向傳播,就隨機從驗證集里抽取一定數量數據來評價其模型的準確率,一輪之后我們獲得訓練誤差率和驗證誤差率。
接下來就是重點了,就是模型訓練。
模型訓練
實際訓練模型的時候,我們會碰到兩大終極難題,一個是欠擬合,一個是過擬合。
所謂欠擬合,就是訓練誤差率和驗證誤差率都很高。
所謂過擬合,就是訓練集的誤差率很低,但是驗證集的誤差率很高。
欠擬合和過擬合其實跟模型的復雜程度有很大的關系。
比如這張圖里面,本來是拋物線的數據,如果用線性模型去擬合的話,效果很很差。如果用9次方模型去擬合的話,雖然訓練集表現非常好,但是測試新數據的時候,你會發現表現很差。
欠擬合的原因其實比較簡單,就是模型的深度不夠,只需要把模型變得復雜一些就能解決。
過擬合的原因就比較多了,一般來說,簡單粗暴的增加訓練集的數量就能解決這個問題,但是有時候受限于客觀條件,我們沒有那么多數據。這時候我們就需要調整一些參數來解決過擬合的問題了。
模型中能調整的參數叫做超參數。
調整這些參數,有時候有道理,有時候又沒有道理,更多的是靠的一種感覺。有人說,調整超參數與其說是個科學,其實更像是一項藝術。
學習率
上面提到的隨機梯度下降中,我們會在梯度的前面加一個系數,我們管它叫做學習率,這個參數直接影響了我們誤差下降的快慢。
當我們遇到問題的時候,先嘗試調整下學習率,說不定就能解決問題。
選擇一個合適的學習率可能是困難的。學習率太小會導致收斂的速度很慢,學習率太大會妨礙收斂,導致損失函數在最小值附近波動甚至偏離最小值。下面這張圖比較好的說明了學習率高低對模型誤差下降的影響。
沖量Momentum
沖量的概念其實就是在梯度下降的時候,把上次的梯度乘以一個系數pho,加上本次計算的梯度,然后乘以學習率,作為本次下降用的梯度。pho一般選取0.9或者0.99。其本質就是加上了之前梯度下降的慣性在里面,所以叫做沖量。
有時候會采用沖量(momentum)能夠有效的提高訓練速度,并且也能夠更好的消除SGD的噪音(相當于加了平均值),但是有個問題,就是容易沖過頭了,不過總體來說,表現還是很不錯的,一般用的也比較多。
下面這兩張圖也能看出來,SGD+沖量能夠有效的加快優化速度,還能夠避免隨機的噪音。
輪數epochs
前面提到,一次正向傳播,一次反向傳播就是一輪,也就是一個epoch。
一般來說,輪數越多,其誤差會越好,但是當學習的越多的時候,他會把一些不太關鍵的特征作為一些重要的判別標準,從而出現了過擬合。如果發現這種情況(下圖),我們需要盡早停止學習。
參數初始化(weights initialization)
對于模型的所有參數,我們均隨機進行初始化,但是初始化的時候我們一般會讓其均值為0,公差為sigma,sigma一般選擇比較大,這樣其分散效果比較好,訓練效果也比較好。
但是有時候僅僅調整超參數并不能解決過擬合的問題,這時候我們需要在模型上做一些文章,在模型上做一些處理,來避免過擬合。
Dropout
最常見的方法就是dropout.
drop的邏輯非常簡單粗暴,就是在dropout過程中,有一半的參數不參與運算。
比如說公司里,每天隨機有一般人不來上班,為了正常運轉,每個崗位都需要有好幾個人來備份,這樣公司就不會過于依賴某一個人,其實是一個道理。
dropout的本質是冗余。為了避免過擬合,我們需要額外增加很多冗余,使得其輸出結果不依賴于某一個或幾個特征。
Pooling池化
除此之外,池化也是比較常用到的。
Pooling主要的作用為降維,降維的同時能夠保留主要特征,能夠防止過擬合。
Pooling主要有兩種:一種是最大化Pooling,還有一中是平均池化。
最大池化就是把區域的最大值傳遞到下一層(見下圖),平均池化就是把區域內的平均值傳遞到下一層。
一般在Pooling之后會加上一個1x1的卷積層,這樣能夠以非常低的成本(運算量),帶來更多的參數,
更深的深度,而且驗證下來效果也非常好。
接下來我們可以分析下Lenet的數據,看的出來是卷積—>池化—>卷積—>池化—>平化(Flatten,將深度轉化為維度)—>全連接—>全連接—>全連接。
下面這個模型也比較簡單,經過多層卷積、池化之后,平化,然后經過softmax轉化。
截止到目前,我們又了解了訓練模型所需要的技巧,如獲取數據、預處理數據、模型搭建和模型調試,重點了解了如何防止過擬合。
恭喜你,現在你已經完全了解了深度學習的全部思想,成功晉級成深度學習高手了~
接下來我們看下深度學習的發展趨勢。
深度學習發展趨勢
目前深度學習在圖像識別領域取得了很多突破,比如可以對一張圖片多次篩選獲取多個類別,并標注在圖片上。
還可以進行圖像分割。
在做圖像分割標注的時候,難度很大,需要把每個類別的范圍用像素級的精度畫出來。這對標注者的素質要求很高。
還可以根據圖像識別的結果直接生成語句。
Google翻譯可以直接將圖片上的字母翻譯過來,顯示在圖片上,很厲害。
最近媒體上很多新聞,說人工智能可以作詩,寫文章,畫畫等等,這也都是比較簡單的。
但是當前圖像識別領域還存在一些問題,最大的就是其抗干擾能力比較差。
下圖中左側的圖片為原始圖片,模型可以輕易識別,但是人工加上一些干擾之后,對于肉眼識別不會造成干擾,但是會引起模型的嚴重誤判。
這種情況可能會在某些很重要的商業應用中帶來一些風險,比如在自動駕駛的物體識別時,如果有人故意對攝像頭造成干擾,就會引起誤判,從而可能會引起嚴重后果。
深度學習在自動駕駛領域有比較多的應用,下面是我做自動駕駛項目中的視頻。
車輛識別:
行為克隆:
下圖為加特納技術曲線,就是根據技術發展周期理論來分析新技術的發展周期曲線(從1995年開始每年均有報告),以便幫助人們判斷某種新技術是否采用。其把技術成熟經過5個階段:1是萌芽期,人們對新技術產品和概念開始感知,并且表現出興趣;2是過熱期,人們一擁而上,紛紛采用這種新技術,討論這種新技術;3是低谷期,又稱幻想破滅期。過度的預期,嚴峻的現實,往往會把人們心理的一把火澆滅;4是復蘇期,又稱恢復期。人們開始反思問題,并從實際出發考慮技術的價值。相比之前冷靜不少;5是成熟期,又稱高原期。該技術已經成為一種平常。
當前機器學習和自動駕駛就處在過熱期。
說到底,人工智能其實就是一種工具而已,只不過這項工具能做的事情多了一些而已。
未來人工智能會融入到生活中的方方面面,我們不可能阻擋這種趨勢,所以我們唯一能做的,就是好好利用好這個工具,讓未來的工作和生活更加方便一些。
送大家一句話:
關于人工智能威脅論
當前有些媒體在肆意宣揚人工智能威脅論,這其實是毫無道理的。
當人類對自己不了解的事物會本能的產生恐懼,越是不了解,越是會產生恐懼。
大家今天看下來,是不是也覺得人工智能也沒啥。
其實就是因為了解了,所以才不會恐懼。我們只有了解他,才能更好的利用好它。
當前有部分無良媒體以及所謂的專家,在傳播人工智能威脅論。
其實所謂的專家根本就不是這個領域的專家,如果他不是這個領域的專家,那他對這個話題其實就沒有話語權,他說話的下分量就跟一個普通人說的沒什么區別。
流傳比較廣的,比如說某個坐在輪椅上的英國物理學家,對,沒錯,我說的就是霍金。
還有某國際著名新能源汽車公司的CEO,對,我說的就是Elon Musk。
他們對人工智能其實也完全是一知半解。
相信大家今天看完這篇文章之后,對人工智能的理解就可以秒殺他們了。
最近看到吳軍的一句話,來解釋人工智能威脅論,覺得非常恰當。
說一下人工智能的邊界:
1. 世界上有很多問題,其中只有一小部分是數學問題;
2. 在數學問題中,只有一小部分是有解的;
3. 在有解的問題中,只有一部分是理想狀態的圖靈機可以解決的;
4. 在后一類的問題中,又只有一部分是今天實際的計算機可以解決的;
5. 而人工智能可以解決的問題,又只是計算機可以解決問題的一部分。
|