聽說程式設計師又把妹子談飛了?——邏輯推理淺談(一)

  • 2019 年 12 月 3 日
  • 筆記

有一天,程式設計師和妹子聊天,討論到手機和電腦邊充電邊使用對電池是否有害的問題,大概對話是這樣:

程式設計師:我聽說電腦一般可以邊充電邊使用,手機不可以呢。

妹子:哦,好像是這樣吧。

程式設計師:對呢,因為電池不能邊充電邊使用的。

妹子:嗯嗯,對啦,我想電腦充電時應該是用電源供電的,手機應該是用電池供電的呢。

程式設計師:哇,你好棒,怎麼能推出這麼深刻的結論!

妹子:這不很簡單么……

程式設計師:天哪,你用到了邏輯推理中最深刻的三段論推理呢!而且內化為自己的能力還渾然不知,好棒喲!

妹子:你好無聊,再見!

嗯嗯,妹子雖然已經走了,可是我們為了飯碗和內心追求,程式設計師還是決定來看看這樣一段自然語言對話里到底蘊含著怎樣的邏輯推理過程,點滴中積累能力,以便日後能夠少加點班。

我們在日常生活中,經常要用到各種形式的邏輯推理,無論是買菜時候算賬,還是考試時候揣摩出題者意圖,或者是猜測讓你心動的女生到底喜不喜歡你的時候,都需要計算,推理,想像,來去估計表面上觀察不到的內容,以獲取真相。可以說,邏輯推理,是人類思考智慧的最集中體現之一,它可以最高效地模擬和補齊觀察的不足,還能為決策提供未來判斷的依據。

那我們人類到底有著怎樣的邏輯推理能力呢?

其實,我們信以為真的推理邏輯無非兩種,形式邏輯辯證邏輯。這一篇我們先講形式邏輯。

形式邏輯

大概高中數學演繹推理部分就講過相關的內容。有效的推理有兩類合情推理和演繹推理,其中合情推理又包括類比推理和歸納推理兩類,所以一共是三種類型,他們的推理模型如下:

類比推理(特殊到特殊):

歸納推理(特殊到一般):

演繹推理(一般到特殊):

僅討論推理邏輯的正確性,如果條件沒有問題的話,那麼僅有演繹推理是絕對正確的。而另外兩個成立與否,並沒有直接的理論支撐,需要更加深入的分析。我們通過幾個例子,來進一步認識這些推理的邏輯:

類比推理

E.g.1 等差數列的通項公式為:an = a1 + (n – 1) * d,那麼等比數列的通項公式為:bm = b1 * q ^ (m – 1)。

這個從淺層的形式上,可以類比他們之間的各種性質,只需要把對應運算符號修改過去。但不是每次都可以成功,比如兩個數列的求和公式之間就沒有這種類比性。而如果從源頭開始推理,就會發現這些類比成立的基礎是:等差數列是等比數列的對數數列。於是這個通項公式就是二者等價的了,但是等差數列的求和公式和等比數列的乘積公式才會有等價關係,和求和之間並沒有什麼聯繫,這一點從類比基礎就很容易看出來。

E.g.2 地球和火星都有大氣層,是恆星,有四季,溫度適宜,地球上有生物。故火星上也有生物。

這一條就是明顯不一定成立的結論,但卻一點不妨礙它在人類邏輯中的作用,類比能提供很多猜想來作為研究的方向,憑藉一些並不能嚴格成立但又時常有效的經驗往往可以更好地找准研究的方向,由於其條件沒有那麼嚴格,所以執行起來條件也寬鬆,在一定意義下人類憑藉此感覺建立了很多研究方向的基礎,再加上一些嚴謹的演繹推理,構築了一個又一個領域的知識寶庫。

歸納推理

E.g.3 我每次看到有人告訴我叫「天鵝」的動物都是白色的,因此天鵝是白色的。

這是典型日常思維中的歸納推理,有智慧的人往往會選擇保留這種思維方式並大膽使用,同時也謹慎地知道這很有可能是錯的。使用它們應像類比推理一樣,既相信其方向的潛力,同時對其是否真的成立仍然需要嚴格的論證才是。

這裡天鵝在我的腦海里構成一個集合,我曾經往這個集合里添加過一些元素並試著總結他們的特性,但是和那個官方認定的天鵝集合的描述和正確答案之間還真不一定完全正確,我有樣本的監督,因為量和學習方式的缺陷,使得我並沒法完全推理正確,比如其實還有黑天鵝,而我只是沒見過而已。

而一種快速的方案是查看文字描述的「天鵝」定義,並已知為標準,但是要承受的是文字到概念映射的資訊損失和偏差。最後,可能天鵝集合都不怎麼客觀存在,只是人類的主觀分類,而且科學界還沒有完全統一。那這個體系就崩塌要陷入混亂了……看來啊,研究數學真幸福,這些細枝末節具體的沒法解決的問題都可以不碰。

E.g.4 數列的前幾項為1, 2, 4,8, 16,下一項是多少?

很多人一看,會想當然的看成下一項是前一項乘以2的規律於是信誓旦旦地寫上32,這便是一種歸納假設下的結論。但世界上不止這一個答案,比如我們考慮由圓上的若干個連接點連線劃分的區域:

當n = 6的時候,

竟然是毫不合直覺的31!

你現在覺得不合理,是不是數錯了,是因為你還沒有掌握這類點線的劃分問題的規律,而只能理解到乘以2這樣的程度,就像當時不理解等比數列的求和公式不能類比於等差數列,發現其本質聯繫是對數關係才能夠完全理解一樣。

演繹推理

E.g.5 孟德爾認為如果豌豆的圓粒還是扁粒性狀是由一對基因g in G = ExpComb(S = {A, a}, n = 2)(這個集合的含義是從有序集S中有放回地抽取n次元素後排序的全集)來分別控制的,其中只要有一個A則表現為圓粒,自然條件下的豌豆都是純種的AA或aa,沒有Aa的品種(注意Aa = aA,因為元素是排序的)。假設交配的豌豆後代從雙方各等概率獲得一個基因,那麼兩代以後,扁粒的概率是1 / 4。

這個就是一個典型的演繹推理了,用了一點簡單的概率論和排列組合知識,而真正核心的部分看起來還不在推理,在這些前提的設定。好處在於只要這些前提成立,那麼結論一定成立,就像1 + 1 = 2那樣肯定。但是這天才般的簡化和定義假設並不那麼容易得到,靠瞎猜肯定不行,往往還需要合情推理的支援,還有實驗結論的觀察,才能助你找到假設的一些可能方向,再在實驗的支援下得到相對可靠的結論。

E.g.6 最後一個例子我們回到開頭的那個故事,那其實是一個典型的三段論式的演繹推理,加一點最簡單的布爾代數。

下面是文字版的演繹推理三段論:

對手機:

大前提:充電時,電器(集合)使用有害是因為電池邊充電邊使用其供電。

小前提:充電時,使用手機(元素特例)有害。

結論:充電時,使用手機是電池供電的。

電腦的同理,只不過大前提改成否命題即可:

大前提:充電時,電器(集合)使用無害是因為電池沒有邊充電邊使用其供電。

小前提:充電時,使用電腦(元素特例)無害。

結論:充電時,使用電腦不是電池供電的,電池和電源直供二者必須有且僅有一個為真,故是電源直接供電的。

這裡的推導其實有4個細節,值得一提:

  1. 大前提其實是我們的隱含知識(常識),但相對正確的常識應該是:電器的電池邊充電邊使用是有害的;我們僅用了其一個子集「充電」上的特例,沒有考慮不充電時候的情況,相當於布爾運算中把」與真」直接當成單位元消去;
  2. 這裡手機其實用了其逆命題,電腦用了逆否命題,前者不一定正確,比如充電時使用有害可能是燙手,而後者一定正確,只要我們的常識是正確的;
  3. 要得到問題結論,還有另外一個隱含知識:電器工作需要電源,電池和電源直供有且只有一個供電;
  4. 整個問題都是在使用的條件下進行的,這是全集。

以上一切都可以用下面的Wenn圖表示的集合關係來說明:

當然這裡最好的說明是用偽程式碼,不,還是直接上程式碼吧:

符號說明:

M:電子產品類

c:電腦

m:手機

cc:電池充電

st:可否充電時使用

s:電源選項

CE:電池

DR:直接電源

C++程式碼:

#include <stdlib.h>  #include <iostream>    using namespace std;    enum Source {CE, DR};    class MC {  private:     enum Source s;     bool cc, st;    public:     MC(bool cc, bool st):cc(cc), st(st) {}     ~MC() {}       enum Source GetSource();  };    enum Source MC::GetSource() {     // logic : cc && (s == CE) = ! st     if (cc) {         return st ? DR: CE;      } else {         if (st) {             cerr << "Cannot judge source, please get cellcharged!n";             exit(- 1);         }     }  }    int  main () {     MC c(true, true), m(true, false);     cout << "Computer is sourced by " <<((c.GetSource() == CE) ? "cell": "direct source") <<" when cell charged.n";     cout << "Mobile phone is sourced by " <<((m.GetSource() == CE) ? "cell": "direct source") <<" when cell charged.n";  }

一個更為驚喜的想法是,其實這三類推理恰恰對應機器學習里的三類學習模式:

歸納推理:集合里的大量元素恰是我們要收集的樣本,我們以某個函數族在上面學習這些樣本的屬性,通過這種方式賴主觀認識他們,最後推演到新來的樣本上。諸如回歸,分類模型等等,都是歸納推理的具體表現,歸納的好壞取決於最開始的函數族和學習策略。

類比推理:kernel類的諸如KNN的機器學習方法就是用的類比推理,這其中的核心便是在已知維度上計算樣本相似度,然後以之作為權重把結果推向未知維度。

演繹推理:在知識圖譜等機器學習技術上,使用的就是這套邏輯,有點硬,召回低,但是足夠可靠。

其實人類也是在這些推理過程中掌握更多的知識,甚至創造知識的。機器學習不過是用這個工具來執行人類的這幾種推理罷了,本質上還是人類學習啦。