人工智慧教程(一):基礎知識
如果你是關注計算機領域最新趨勢的學生或從業者,你應該聽說過人工智慧、數據科學、機器學習、深度學習等術語。作為人工智慧系列文章的第一篇,本文將解釋這些術語,並搭建一個幫助初學者入門的簡易教學平台。
如今,計算機科學領域的學生和從業者絕對有必要了解 人工智慧 、 數據科學 、 機器學習 、 深度學習 方面的基本知識。但是應該從哪裡開始呢?
為了找到答案,我瀏覽了大量人工智慧的教材和教程。它們有的從大量數學理論開始,有的用編程語言無關的方式(不要求你了解某一門特定的編程語言)講解,有的假設你是線性代數、概率論和統計學專家。在很大程度上,它們都很有用。但它們都沒有回答最重要的問題:真正的初學者應該從哪裡開始學習人工智慧?
開始學習人工智慧的方式多種多樣,但是我對它們各有擔憂。涉及太多的數學會讓人分心,但如果數學介紹得太少就好像駕駛員不知道汽車引擎在哪裡一樣。對於未來的人工智慧工程師和數據科學家來說,從進階概念開始講解是最有效率的方式,因為他們精通線性代數、概率論和統計學。如果從基礎知識開始,然後在中間某個地方結束也可以,只要學員想要在這裡結束學習。考慮到所有這些事實,我認為初學者的人工智慧教程應該從基礎知識開始,並以一個實際的人工智慧項目結束。這個項目可能很小,但是在相同任務上它將會超越任何傳統項目。
本系列將從最基礎的知識講到中等水平內容。除了討論人工智慧,我還希望對相關的話題進行一些澄清,因為人們對人工智慧、機器學習、數據科學等術語有很多困惑。人工智慧程序是必要的,因為我們每天會產生海量的數據。根據互聯網上查詢到的結果,我們每天大約會產生 2.5x10 18 位元組的數據。但是,這些數據中的大多數與我們完全無關,包括大量沒有價值的 YouTube 視頻,不經思考就發送的電子郵件,瑣碎的新聞報道等等。然而,這片浩瀚的數據海洋中同樣蘊含著無價的寶貴知識。傳統軟體無法完成處理這些數據的艱巨任務。人工智慧是少數能夠應對這種信息過載的技術之一。
當談到到人工智慧時,我們還需要區分事實和假象。我記得幾年前聽一位人工智慧專家的演講。他講述了一個人工智慧圖像識別系統,它能近乎絕對準確地分辨西伯利亞雪橇犬和西伯利亞雪狼的圖像。在互聯網上搜索一下,你會看到這兩種動物有多麼相似。如果這個系統確實那麼準確,它將是人工智慧的奇蹟。可惜的是,事實並非如此。該圖像識別系統只是對圖像的背景進行了分類。西伯利亞雪橇犬是家養動物,它的圖像背景中幾乎總會有一些矩形或圓形的物體。而西伯利亞雪狼是野生動物,它所在的背景中有雪。這些例子導致近年來人們對人工智慧提出了準確性擔保要求。
確實,最近幾年人工智慧展現了一些真正的力量。舉個簡單例子就是 YouTube、Amazon 等網站的推薦系統。很多時候我驚訝於它們的推薦結果,就好像它們會讀心術一樣。然而不論這些推薦的質量如何,「人工智慧到底是好是壞?」都是一個很熱門話題。我認為,一個像《終結者》中機器有意識地攻擊人類的未來還遙遙無期。然而,前面那句話中的「有意識地」一詞非常重要。目前的人工智慧系統可能發生故障,並且意外地傷害到人類。但是,許多號稱具有人工智慧能力的系統實際上只是包含大量分支和循環的常規軟體。因此目前可以安全地說,我們還沒有在日常生活中看到人工智慧的真正威力。不論是好的影響(如治癒癌症),還是壞的影響(合成的世界領導人視頻導致的暴動和戰爭),我們都只能拭目以待了。就個人而言,我相信人工智慧是一種福祉,並將大大提高未來幾代人的生活質量。
什麼是人工智慧?
在我們進一步探討之前,讓我們試著理解人工智慧(AI)、機器學習(ML)、深度學習(DL)、數據科學(DS)等之間的聯繫和區別。這些術語經常被誤用為同義詞。圖 1 表示了人工智慧、機器學習、深度學習和數據科學之間的關係。當然這不是唯一的劃分方式,你可能會看到其它的劃分圖。但在我看來,圖 1 是最貼切的,它能夠最大程度地概括這些領域之間關係。
在本系列的第一篇文章中,我不會對每個術語定義進行精確的定義。我認為在現階段,精確地定義它們是適得其反的,是浪費時間。但在後續的文章中,我們將重新討論這些術語並正式定義它們。目前我們可以暫時把人工智慧看作是可以在某種程度上模仿人類智能的程序。那人類智能又是指什麼呢?
想像一下你的人工智慧程序是一個一歲大的嬰兒。這個寶寶會通過聽周圍人說話來學習母語。他/她將很快學會識別形狀,顏色,物體等,沒有任何困難。此外,他/她將能夠對周圍人的情緒做出反應。例如,任何一個三歲的嬰兒都知道如何用甜言蜜語讓父母給他/她巧克力和棒棒糖。同樣,人工智慧程序也將能夠感知並適應環境,就像嬰兒一樣。然而,這種真正的人工智慧只能在遙遠的未來實現。
圖 1 顯示機器學習是人工智慧的真子集,它也是實現人工智慧系統的技術之一。機器學習是使用大量數據來訓練程序的技術,以便有效地執行必要的任務。它的準確性隨著訓練集的增大而增加。請注意,還有其它技術用於開發人工智慧系統,如基於布爾邏輯的系統,基於模糊邏輯的系統,基於遺傳編程的系統等。然而,如今機器學習是實現人工智慧系統的最主流的技術。圖 1 還顯示深度學習是機器學習的真子集,它只是眾多機器學習技術中的一種。但目前實際上大多數嚴肅的機器學習技術都用到了深度學習。在這一點上,我甚至避免嘗試定義深度學習。請記住,深度學習涉及到使用大型人工神經網路。
那數據科學(圖 1 中的紅圈)是做什麼的呢?數據科學是計算機科學/數學領域中的一門處理和解讀大規模數據的學科。我說的「大」,有多大呢?早在 2010 年,Facebook 等一些企業巨頭就聲稱它們的伺服器可以處理幾 Pb 的數據。當我們說大數據時,通常指的是 Tb 或 Pb 級的數據規模,而不是 Gb 級的。許多數據科學應用涉及人工智慧、機器學習和深度學習技術的使用。因此,當我們討論人工智慧時,很難不提到數據科學。數據科學也使用很多傳統的編程和資料庫管理技術,比如使用 Apache Hadoop 進行大數據分析。
本系列的討論將主要集中在人工智慧和機器學習上,並涉及數據科學。
教學環境搭建
在表明了本系列文章的主題後,現在說說本教程的前置條件。你需要一台 Linux 電腦(當然 Windows 或 macOS 機器也可以,只是在一些安裝步驟上可能需要額外的協助),並了解基本的數學和計算機編程知識。我希望在細心地閱讀本系列文章後,你會感受到人工智慧的強大。
用編程語言無關的方式來學習人工智慧是可能的,但本系列將基於一門編程語言並涉及大量的編程。在決定使用哪一門編程語言之前,我們先來回顧一下人工智慧、機器學習、深度學習和數據科學領域流行的編程語言。Lisp 是一種函數式編程語言,它是最早用於開發人工智慧程序的語言之一。Prolog 是一種邏輯編程語言,在 20 世紀 70 年代也被用於同樣的目的。我們將在接下來的介紹人工智慧歷史的文章中更詳細地介紹 Lisp 和 Prolog。
如今,Java、C、C++、Scala、Haskell、MATLAB、R、Julia 等編程語言也被用於開發人工智慧程序。Python 在人工智慧程序開發中被廣泛使用,這使我們選擇它作為本教程的編程語言。但我必須聲明,從這裡開始做的選擇(更確切地說,是我替你做的選擇),主要考慮的因素是易用性、受歡迎程度、(在少數情況下)我自己對該軟體/技術的適應和熟悉程度、對本教程效率的提升。但同時,我也鼓勵你嘗試其它的編程語言、軟體和工具。也許從長遠來看,它們對你來說可能是更好的選擇。
現在我們需要立即做出另一個選擇:使用 Python 2 還是 Python 3?考慮到本系列有許多年輕的讀者,他們還有漫長的職業生涯,我將選擇使用 Python 3。在 Ubuntu 系統終端中執行命令 sudo apt install python3
安裝最新版本的 Python 3(你的系統中可能已經安裝了 Python 3)。在其它 Linux 發行版、Windows 和 macOS 機器上安裝 Python 3 也非常容易。執行下面的命令查看安裝的 Python 3 的版本:
python3 --version
Python 3.8.10
在後續的教程中,我們需要安裝許多 Python 包,所以需要一個包管理器。目前主流的包管理器有 pip、Conda 和 Mamba 等。我選擇 pip 作為包在本教程的管理器。它相對簡單,也是推薦的 Python 安裝工具。我認為 Conda 和 Mamba 是比 pip 更強大的工具,你可以嘗試一下它們。運行命令 sudo apt install python3-pip
將在 Ubuntu 系統中安裝 pip。pip、Conda 和 Mamba 是跨平台軟體,它們可以安裝在 Linux、Windows 和 macOS 系統上。運行命令 pip3 --version
查看系統中安裝的 pip 版本,如下所示:
pip 20.0.2 from /usr/lib/python3/dist-packages/pip (python 3.8)
現在我們需要一個 Python 集成開發環境(IDE)。IDE 能幫助程序員更容易地編寫、編譯、調試和執行代碼。PyCharm、IDLE、Spyder 等都是流行的 Python IDE。然而,由於我們的主要目的是開發人工智慧和數據科學程序,這裡考慮另外兩個強有力的競爭者 —— JupyterLab 和谷歌 Colab。嚴格地說,它們不僅僅是 IDE;它們是非常強大的基於網路的互動式開發環境。兩者都可以在網路瀏覽器上工作,並提供強大的功能。JupyterLab 是由非營利組織 Project Jupyter 支持的免費開源軟體。谷歌 Colab 遵循 免費增值 模式,即基本功能免費,附加功能收費。我認為谷歌 Colab 比 JupyterLab 功能更強大。但是由於谷歌 Colab 的免費增值模式,以及我相對缺乏谷歌 Colab 的使用經驗,在本教程中我選擇 JupyterLab。但我仍然強烈建議你去了解一下谷歌 Colab。
可以使用命令 pip3 install JupyterLab
在本地安裝 JupyterLab。執行命令 jupyter-lab
將在系統的默認網路瀏覽器中運行 JupyterLab。Project Jupyter 還提供一個更老的類似系統,稱為Jupyter Notebook。可以通過 pip3 install Notebook
命令在本地安裝 Jupyter Notebook,用Jupyter Notebook
運行它。但 Jupyter Notebook 的功能不如 JupyterLab 強大,且官方宣布它最終會被 JupyterLab 取代。在本教程中,我們將在合適的階段使用 JupyterLab。但在開始階段,我們將使用 Linux 終端來運行 Python 程序,因此急需的是包管理器 pip。
Anaconda 是一個非常流行的 Python 和 R 編程語言發行版,它主要用於機器學習和數據科學領域。作為未來的人工智慧工程師和數據科學家,熟悉使用 Anaconda 也是一個不錯的選擇。
現在我們需要確定最重要的一點 —— 本教程的風格。有大量人工智慧開發相關的 Python 庫,比如 NumPy、SciPy、Pandas、Matplotlib、Seaborn、TensorFlow、Keras、Scikit-learn 和 PyTorch。許多關於人工智慧、機器學習和數據科學的教材和教程都是基於對其中一個或多個庫的完整講解。儘管對特定包的功能進行這樣的覆蓋講解是一種高效的方式,但我的教程是更面向數學的。我們將首先討論開發人工智慧程序所需的數學概念,然後再介紹需要的 Python 基礎知識和 Python 庫。我們會為了探索實現這些數學概念所需的特性而不斷回顧這些 Python 庫。有時我也會要求你自己學習一些 Python 和數學的基本概念。
在完成這些準備工作之後,如果我們就在這裡結束,任何代碼或數學概念都不講,那將是一種罪過。因此,我們將繼續學習人工智慧和機器學習中最重要的數學概念:向量和矩陣。
向量和矩陣
矩陣是按行和列排列的數字、符號或數學表達式構成的矩形陣列。圖 2 顯示了一個 2 × 3 矩陣,它有 2 行和 3 列。如果你熟悉編程,在許多流行的編程語言中這個矩陣可以表示為一個二維數組。只有一行的矩陣稱為行向量,只有一列的矩陣稱為列向量。 就是一個行向量。
為什麼矩陣和向量在人工智慧和機器學習中如此重要呢?人工智慧和機器學習中廣泛使用線性代數,而矩陣和向量是線性代數的核心。幾個世紀以來,數學家們一直在研究矩陣和向量的性質和應用。高斯、歐拉、萊布尼茨、凱利、克萊姆和漢密爾頓等數學家在線性代數和矩陣論領域都有以他們的名字命名的定理。多年來,線性代數中發展出了許多分析矩陣和向量性質的技術。
複雜的數據通常可以很容易用向量或矩陣來表示。舉一個簡單的例子,從一個人的醫療記錄中,可以得到詳細的年齡、身高(厘米)、體重(公斤)、收縮壓、舒張壓和空腹血糖(毫克/分升)。這些信息可以很容易用行向量來表示, 。人工智慧和機器學習的第一個挑戰來了:如果醫療記錄有十億條怎麼辦?即使動用成千上萬的專業人員從中手動提取數據,這項任務也是無法完成的。因此,人工智慧和機器學習利用程序來提取數據。
人工智慧和機器學習的第二個挑戰是數據解讀。這是一個廣闊的領域,有許多技術值得探索。我將在後續文章中介紹相關內容。人工智慧和機器學習應用除了面臨數學/計算方面的挑戰外,還面臨硬體方面的挑戰。隨著處理的數據量的增加,數據存儲、處理器速度、功耗等也成為人工智慧應用面臨的重要挑戰。但現在讓我們先拋開這些挑戰,動手編寫第一行人工智慧代碼。
我們將編寫一個簡單的 Python 腳本,用來將兩個向量相加。我們將用到名為 NumPy 的 Python 庫,它支持多維矩陣(數組)的數學運算。用命令 pip3 install numpy
為 Python 3 安裝 NumPy 包。如果你使用的是 JupyterLab、谷歌 Colab 或 Anaconda,那麼 NumPy 應該已經被預安裝了。但是為了演示,在本系列的前幾篇文章中,我們都將在 Linux 終端上操作。在 Linux 終端上執行命令 python3
進入 Python 控制台。在這個控制台中可以逐行執行 Python 代碼。圖 3 展示了在控制台中逐行運行 Python 代碼,將兩個向量相加,並輸出結果。
首先,讓我們試著逐行理解這些代碼。由於本教程假定的編程經驗很少,所以我將代碼行標記為【基本】或【AI】。標記為【基本】的行是經典 Python 代碼,標記為【AI】的行是用於開發人工智慧程序的代碼。通過區分基本和進階的 Python 代碼,我希望具有基本知識和中級編程技能的程序員都能夠高效地使用本教程。
import numpy as np #【基本】
a = np.array([11, 22, 33]) #【AI】
b = np.array([44, 55, 66]) #【AI】
c = np.add(a, b) #【AI】
print(c) #【基本】
import numpy as np
導入 numpy 庫並將其命名為 np
。Python 中的 import
語句類似於在 C/C++ 用 #include
來包含頭文件,或者在 Java 中用import
來使用包。
a = np.array([11, 22, 33])
和 b = np.array([44, 55, 66])
分別創建了名為 a
和 b
的一維數組(為了便於理解,目前假設向量等價於一維數組)。
c = np.add(a, b)
將向量 a
和b
相加,並將結果存儲在名為 c
的向量中。當然,用 a
,b
,c
作為變數名是一種糟糕的編程實踐,但數學家傾向於將向量命名為 、 、 等。如果你完全沒有 Python 編程經驗,請自行了解 Python 變數的相關知識。
print(c)
在終端上列印對象的值,即向量 [55 77 99]
。你可以暫時這樣理解向量相加, c = [55=11+44 77=22+55 99=33+66]
。如果你想正式地了解向量和矩陣是如何相加的,但手頭又沒有相關的教材,我建議閱讀維基百科上關於矩陣加法的文章。在網上搜索一下就會發現,用經典的 C/C++ 或 Java 程序來實現向量相加需要更多的代碼。這說明 Python 很適合處理向量和矩陣。當我們執行越來越複雜的向量運算時,Python 的強大將進一步顯現。
在我們結束本文之前,我要做兩個聲明。第一,上面討論的示例只處理了兩個行向量(確切地說是 1 x 3 的矩陣)的相加,但真正的機器學習應用可能要處理 1000000 X 1000000 的矩陣。但不用擔心,通過練習和耐心,我們將能夠處理這些問題。第二,本文中給出許多定義包含了粗略的簡化和不充分的描述。但如前面所說,在本系列結束之前,我將給這些模糊的術語下一個正式的定義。
現在我們該結束這篇文章了。我希望所有人都安裝文中提到的必要軟體,並運行本文中的代碼。在下一篇文章中,我們將首先討論人工智慧的歷史、範疇和未來,然後深入探討線性代數的支柱——矩陣論。
(題圖:MJ/25071901-abc4-4144-bf27-4d98bb1d9301/)
via: https://www.opensourceforu.com/2022/08/artificial-intelligence-explaining-the-basics/
作者:Deepu Benson 選題:lkxed 譯者:toknow-gh 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive