Sơ lược về trí tuệ nhân tạo

Trí tuệ nhân tạo có thể chia làm hai trường phái chính là: trí tuệ nhân tạo cổ điển (Classical AI, CAI) và trí tuệ nhân tạo hiện đại (Modern AI, MAI). Mặc dù tên gọi có vẻ khác biệt về mặt thời gian, hai trường phái này thực sự xuất hiện gần như cùng lúc, vào khoảng những năm 1940 khi máy tính bắt đầu được xây dựng (chúng ta không cho những công trình toán học, triết học cổ xưa về hoạt động tư duy của con người là thuộc trí tuệ nhân tạo).

Trí tuệ nhân tạo cổ điển thường dựa trên việc tìm kiếm lời giải trong một cơ sở tri thức xác định trước. Để hệ thống có thể hoạt động được, lập trình viên phải chỉ rõ cách thức để tìm kiếm, suy luận và đưa ra quyết định. Hướng tiếp cận này đã đạt được những thành công đáng kể khi xây dựng nên những hệ chuyên gia (expert systems), những chương trình chơi cờ đánh bại các nhà vô địch thế giới, …

Tuy nhiên phương pháp này gặp phải rất nhiều khó khăn khi giải quyết những bài toán mà con người có thể dễ dàng giải được nhưng chính chúng ta cũng không biết ta thực hiện nó như thế nào, ví dụ như việc dạng đồ vật hay đọc hiểu một đoạn văn bản. Để hiểu được một văn bản, theo cách tiếp cận của CAI, chúng ta phải liệt kê toàn bộ các luật ngữ pháp và ý nghĩa của từng từ trong từng ngữ cảnh khác nhau. Việc đó là vô cùng tốn kém thậm chí là không thể bởi số lượng các luật là rất lớn và số lượng ngữ cảnh còn lớn hơn rất nhiều tới mức gần như là vô hạn. Phương pháp trên còn cực kì nhạy cảm với việc thay đổi bài toán, một hệ thống nhận dạng văn bản tiếng Anh không thể sử dụng cho tiếng Việt và càng không thể sử dụng cho việc nhận dạng ảnh được, chúng ta cần phải xây dựng một cơ sở tri thức hoàn toàn mới cho mỗi bài toán mới. Do đó, chúng ta cần những phương pháp mới có khả năng tự động phát hiện các quy luật và tự động thích nghi với những bài toán mới. Đó chính là mục tiêu của trí tuệ nhân tạo hiện đại và phương pháp phổ biến nhất, gần như chiếm trọn trí tuệ nhân tạo hiện nay là học máy (Machine Learning, ML).

VOSNET – spoj

Đề bài:

Thuật toán:

  • Nhận xét, sau mỗi ngày khoảng cách giữa 2 đỉnh bất kì giảm đi nửa.
  • Gọi a[u][v] là khoảng cách ngắn nhất từ đỉnh u -> v (tính trong O(n * (n + m)) )
    Thời gian đi từ u -> v = k bé nhất sao cho 2 ^ k >= a[u][v]. (dùng toán tính trong O(1))
    => O(n * (n + m) + n * n)

Code:

#include <bits/stdc++.h>
using namespace std;
 
const int N = 3333;
 
int n, m;
int a[N][N], ans[N];
vector <int> adj[N];
 
void bfs(int r) {
    queue <int> q;
    q.push(r);
    while (!q.empty()) {
        int u = q.front(); q.pop();
        for (int v : adj[u]) if (v != r && !a[r][v]) {
            a[r][v] = a[r][u] + 1;
            //cerr << r << " " << v << " " << a[r][v] << "\n";
            q.push(v);
        }
    }
}
 
int main() {
//    freopen("input.in", "r", stdin);
  //  freopen("output.out", "w", stdout);
 
    scanf("%d%d", &n, &m);
    while (m--) {
        int u, v; scanf("%d%d", &u, &v);
        adj[u].push_back(v);
        adj[v].push_back(u);
    }
 
    //bfs(2);
    for (int i = 1; i <= n; ++i) bfs(i);
 
    for (int i = 1; i <= n; ++i) for (int j = i + 1; j <= n; ++j) if (a[i][j] != 0) {
        int k = log2(a[i][j]);
        k += 1ll << k != a[i][j]; //cerr << i << " " << j << " " << a[i][j] << " " << k << "\n";
        ans[k]++;
    }
    for (int i = 1; i <= n; ++i) {
        printf("%d ", ans[i]);
        if (ans[i] == 0) break;
    }
 
    return 0;
}

CBUYING – spoj

Đề bài:

Thuật toán:

  • Chọn số những sô cô la có giá rẻ nhất

Code:

#include <bits/stdc++.h>
using namespace std;
#define FOR(i,a,b) for (int i=(a),_b=(b);i<=_b;i=i+1)
#define FORD(i,b,a) for (int i=(b),_a=(a);i>=_a;i=i-1)
#define REP(i,n) for (int i=0,_n=(n);i<_n;i=i+1)
#define FORE(i,v) for (__typeof((v).begin()) i=(v).begin();i!=(v).end();i++)
#define ALL(v) (v).begin(),(v).end()
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define SZ(x) ((int)(x).size())
#define double db
typedef long long ll;
typedef pair<ll,ll> PII;
const ll mod=1000000007;
ll powmod(ll a,ll b) {ll res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
const int MAXN = 1E6+3;
const int oo = 1e9+3;
 
int n;
ll ans, b;
PII a[MAXN];
 
bool cmp(PII a, PII b) {
    return (a.fi < b.fi);
}
 
int main() {
    cin >> n >> b;
    FOR(i,1,n) cin >> a[i].fi >> a[i].se;
    sort(a+1,a+n+1,cmp);
    FOR(i,1,n) {
        if (b < a[i].fi) break;
        ll tmp = b / a[i].fi;
        b -= min(tmp,a[i].se) * a[i].fi;
        ans += min(tmp,a[i].se);
    }
    cout << ans;
	return 0;
}

[Discrete Mathematics] Relations

1. Introduction

a. Definition

  • Let $A$ and $B$ be sets. A binary relation from $A$ to $B$ is a subset of A x B.$$ R \subseteq A × B $$$$ aRb : (a,b) \in R $$
  • relation on a set A is a relation from A to A.

b. Properties of relations

  • A relation $R$ on a set $A$ is called reflexive if $ (a, a) \in R, \forall a \in A $
  • A relation $R$ on a set $A$ is called symmetric if $ (a, b) \in R \Rightarrow (b,a) \in R, \forall a, b \in A $
  • A relation $R$ on a set $A$ is called antisymetric” if $ aRb \land bRa \Rightarrow a=b, \forall a,b \in A $
  • A relation $R$ on a set $A$ is called transitive if $ aRb \land bRc \Rightarrow aRc, \forall a,b,c \in A $

References

  • Discrete Mathematics and Its Applications 7th Edition, Kenneth H. Rosen
  • Đại số tuyến tính, Nguyễn Hữu Việt Hưng

COLOREC – spoj

Đề bài:

Thuật toán:

Với bài này ta gán mỗi màu cho một bit từ 0 đến 3, sau đó có thể quy hoạch động để đếm như sau:

Cố định 2 dòng i và j, ta đếm số hình chữ nhật 4 màu có cạnh nằm trên dòng i và j như sau:

Gọi F(c) là số cặp đỉnh có màu là c (c là tổng màu của 2 đỉnh đó) thì số hình chữ nhật 4 màu nhận được từ 2 đỉnh đó là F(15 – c).

Từ đó ta có thể dùng 3 vòng for để tính như trong code.

Code:

#include <iostream>
#include <vector>
using namespace std;
 
int main() {
    ios::sync_with_stdio(false); cin.tie(0);
    int n; cin >> n;
    vector< vector<int> > a(401, vector<int>(401, 0));
    while (n--) {
        int u, v, c; cin >> u >> v >> c;
        a[u + 200][v + 200] = 1 << (c - 1);
    }
#define rep(i, a, b) for (int i=a; i<=b; i++)
#define LL long long
    LL res = 0;
    rep(i, 0, 400) rep(j, 0, i) {
        vector<LL> f(16, 0);
        rep(k, 0, 400) if (a[i][k] && a[j][k] && a[i][k] != a[j][k]) {
            int c = a[i][k] | a[j][k];
            res += f[15 - c];
            f[c]++;
        }
    }
    cout << res;
    return 0;
}

VOITSORT – spoj

Đề bài:

Thuật toán:

Trong bài toán này, ta nhận thấy không còn cách nào khác ngoài việc xây dựng
tất cả K hoán vị theo yêu cầu và kiểm tra từng hoán vị.

Để full điểm, ngoài việc kiểm tra như trong đề bài mô tả, ta cần có thêm
một số cái nhìn tinh tế hơn.

Thứ nhất, do lượng hoán vị cần xét là
$K \leq 10^6 < 10!$ , do vậy mọi hoán
vị cần xét dường như chỉ xoay quanh việc thay đổi thứ tự 10 phần tử cuối
cùng. Trên thực tế, sẽ có tối đa một lần có hơn 10 phần tử cuối cùng thay
đổi trong dãy hoán vị và việc này không làm ảnh hưởng nhiều tới tính hiệu
quả của nhận xét này.

Thứ hay, có thể phát biểu thuật toán T(p) với một chút khác biệt như :

  • p có không nhiều hơn 1 phần tử, T(p) = true
  • p có nhiều hơn 1 phần tử, gọi X là vị trí của phần tử lớn nhất trong p,
    pL là các phần tử bên trái của X và pL là các phần tử bên phải của X, khi đó
    T(p) = true khi:

    • T(pL) = T(pR) = true
    • Tất cả các phần tử trong pL nhỏ hơn tất cả các phần tử trong p

Cách phát biểu khác biệt này đưa ra một nhận xét tổng quát hơn: “T(p) = true
khi và chỉ khi không tồn tại 3 vị trí $i < j < k$ mà $p_k < p_i < p_j$

Cách phát biểu mới này giúp ta có một thuật toán kiểm tra T(p) hiệu quả hơn
như sau: Để đảm bảo T(p) = true, với mọi vị trí j nằm trong p, gọi R là phần
tử nhỏ nhất phía bên phải j và L là phần tử lớn nhất nhỏ hơn $p_j$ phía trái
j, ta phải đảm bảo rằng $L < R$

Tuy nhiên, trong thực tế ta chỉ cần kiểm tra điều kiện trên cho những phần
tử bị thay đổi so với hoán vị trước (khoảng 10 phần tử cuối cùng) nên thuật
toán có thể chạy trong thời gian cho phép.

Code:

#include <cstdio>
#include <vector>
using namespace std;
 
// Hàm sinh hoán vị tiếp theo trong thứ tự từ điển.
// Trả về `k` là vị trí mà hoán vị bắt đầu thay
// đổi so với hoán vị trước.
// k < 0 nếu đây đã là hoán vị cuối cùng.
int next(vector<int> &a) {
    int k, l, n = a.size();
    for (k = n-2; k>=0; k--) if (a[k] < a[k+1]) break;
    if (k<0) return k;
    for (l = n-1; l>k; l--) if (a[k] < a[l]) break;
    swap(a[k], a[l]);
    for (int i=k+1, j=n-1; i<j; i++, j--) swap(a[i], a[j]);
    return k;
}
 
bool f[1000];
int seed = 0;
int cache[1001];
 
// Kiểm tra xem tại a[i] có thỏa điều kiện L < R
// như đã giải thích ở trên hay không.
bool check(const vector<int> &a, int i) {
    int n = a.size();
    seed += 1;
    int r = 1e9;
    // Tìm R là giá trị nhỏ nhất ở bên phải a[i]
    // Đồng thời đánh dấu các giá trị xuất hiện
    // ở bên phải a[i]
    for (int j=i+1; j<n; j++) {
        cache[a[j]] = seed;
        r = min(r, a[j]);
    }
    // Tìm L là giá trị lớn nhất nhỏ hơn a[i]
    // ở bên trái a[i] => L không xuất hiện ở bên phải
    int l = 0;
    for (int j=a[i]-1; j>=1; j--) {
        if (cache[j] != seed) {
            l = j;
            break;
        }
    }
    return l < r;
}
 
// Lần lượt kiểm tra và cập nhật các phần tử
// từ a[k] trở lên, đồng thời kiểm tra xem
// tất cả các phần tử có thỏa mãn điều kiện
// L < R hay không.
bool ok(const vector<int> &a, int k) {
    int n = a.size();
    for (int i=k; i<n; i++) {
        f[i] = check(a, i);
        if (i>0) f[i] &= f[i-1];
    }
    return f[n-1];
}
 
int main() {
    int n, m;
    scanf("%d%d", &n, &m);
    vector<int> a(n);
    for (int i=0; i<n; i++) scanf("%d", &a[i]);
 
    int k = 0, count = 0;
    while (m--) {
        if (ok(a, k)) count++;
        k = next(a);
        if (k < 0) break;
    }
 
    printf("%d", count);
    return 0;
}

ML #3 – Overfitting và những triết lý cuộc đời

Chào các bạn, chúng ta chào đón nhau bằng một nụ cười thật tươi và chúc bạn một ngày mới với những niềm vui mới. Các bạn thân mến của tôi, có lẽ rằng với rất nhiều người, khoa học tự nhiên vốn là khoa học của những con số, những công thức, những giải thuật và vô hình chung người ta đã quan niệm rằng nó tách biệt hoàn toàn với khoa học xã hội – khoa học của các triết lý, khoa học của nhân sinh quan, thế giới quan… Chúng vốn dĩ đã là hai ngành khoa học chẳng thể tách rời nhưng có lẽ vì một lý do nào đó mà rất nhiều người đã không nhìn ra rằng có một sợi dây vô hình song rất bền chặt gắn kết chúng lại với nhau, rằng từ những con số tưởng chừng rất khô khan luôn luôn tiềm tàng một triết lý sống mà đôi khi chúng ta phải mất cả một cuộc đời để trải nghiệm. Điều mà tôi muốn nói đến ngày hôm nay không phải là một vấn đề mới, thậm chí còn là cũ mèm. Over filting – một thuật ngữ có lẽ đã quá quen thuộc đối với những người nghiên cứu các giải thuật thống kê và đặc biệt là lĩnh vực Machine Learning nhưng ẩn sâu trong nó là những bài học về nhân sinh thật sự kì diệu. Và bạn….chính bạn chứ không phải ai khác, bạn đã sẵn sàng cho con đường tìm ra mối liên hệ rất tự nhiên mà lại kì diệu đó chưa???

Bạn hiểu thế nào về Over-fitting

Bản chất của Machine Learning chính là việc sử dụng máy tính để mô hình hóa dữ liệu rồi từ các mô hình đó chúng ta đưa ra các dự đoán cho tương lai. Chúng ta có thể sử dụng rất nhiều các thuật toán khác nhau phục vụ cho việc mô hình hóa dữ liệu của chúng ta, tìm kiếm ra các mối tương quan ẩn chứa trong tập dữ liệu mà chúng ta thu thập được trong quá khứ (chúng ta gọi đó là tập dữ liệu huấn luyện). Suy nghĩ của đại đa số người chính là một mô hình tốt nhất trên tập dữ liệu huấn luyện thì cũng sẽ tốt nhất khi áp dụng vào thực tế (tức là khi chạy trên tập dữ liệu kiểm tra). Điều này đôi khi là một sai lầm, bằng chứng là cho thấy có rất nhiều mô hình cho kết quả rất tốt đối với tập dữ liệu hiện tại nhưng lại hoàn toàn không thể đem áp dụng trên thực tế vì kêt quả dự đoán quá thấp. Hiện tượng mà mô hình dữ liệu làm việc tốt trên tập dữ liệu mẫu nhưng lại bất lực trước việc dự đoán dữ liệu thực tế được gọi là Over Fitting mà theo ngôn ngữ kiếm hiệp người ta gọi là tẩu hỏa nhập ma. Chúng ta cùng xem xét một ví dụ như sau:

Bài toán dự đoán độ hài lòng của các cặp đôi sau hôn nhân Bằng các cuộc khảo sát nhiều cặp vợ chồng, các nhà nghiên cứu tâm lý học đã thu được một biểu đồ thể hiện được mức độ hài lòng của các cặp vợ chồng sau khi kết hôn. Chúng ta có thể thấy, nhìn chung thì mức độ hài lòng suy giảm theo thời gian, nhưng mối liên quan với thời gian không hẳn tuân theo phương trình đường thẳng. Trong 3 năm đầu, mức độ suy giảm khá nhanh, nhưng sau đó tăng trong năm thứ 4 và 5; sau 5 năm thành hôn thì mức độ hài lòng lại suy giảm nữa.

Việc cần làm của những nhà nghiên cứu bây giờ là tìm ra mô hình hay phương trình tốt nhất để mô tả sự tương quan trong tập dữ liệu đó. Nếu gọi mức độ hài lòng là y và thời gian là t thì bản chất của chúng ta là đi tìm sự phụ thuộc y = f(t). Dễ thấy được ngay mô hình đơn giản nhất là mô hình hồi quy tuyến tính, tức là đi tìm tham số ab sao cho y = a + b.t. Sử dĩ nó đơn giản vì phương trình chúng ta chỉ phụ thuộc vào duy nhất một tham số b liên quan đến thời gian t mà thôi. Mô hình này giải thích được 90% sự khác biệt của dữ liệu như hình dưới (hồi quy tuyến tính là đường thẳng liền):

Tuy nhiên chúng ta có thể thấy được rằng mức độ hài lòng có sự biến thiên không tuân theo quy luật tuyến tính, điều này thể hiện ở việc mức độ hài lòng tăng vào năm thứ 4-5 và giảm sau đó. Điều này làm ta nghĩ đến một mô hình có bậc cao hơn. Bằng các kĩ thuật nâng bậc của mô hình với sự trợ giúp của các ngôn ngữ lập trình như R hay Python chúng ta dễ dàng tìm được mô hình bậc 2 với 2 tham số dạng:

Mô hình này thể hiện bằng đường nét đứt như biểu đồ trên. Mô hình này thật sự tốt, nó giải thích được 93% sự dị biệt của dữ liệu. Tuy nhiên chúng ta vẫn chưa coi thế là đủ, tư tưởng được đằng chân lân đằng đầu khiến chúng ta kì vọng có được mô hình tốt hơn giải thích được 100% phương sai của biến y. Việc này cũng chẳng khó khăn với các ngôn ngữ lập trình như R chỉ chưa đầy 3 phút chúng ta có thể tìm được một mô hình với 9 tham số, giải thích gần như hoàn toàn sự dị biệt của dữ liệu. Mô hình này thể hiện bằng đường cong in đậm trong hình trên.
Tuy nhiên, mục đích của mô hình được tạo ra không phải để giải thích dữ liệu hiện tại, mà để dự đoán được các dữ liệu tương lai sẽ như thế nào. Vì tương lai là thứ mà chúng ta chưa thể đoán biết được. Vậy câu hỏi đặt ra là 3 mô hình trên (1 tham số, 2 tham số, và 9 tham số) thì mô hình nào dự báo tốt nhất ??? Không ngạc nhiên khi mô hình 1 tham số tiên lượng mức độ hài lòng tiếp tục giảm trong năm 11, còn mô hình 2 tham số cũng tiên lượng giảm nhưng giảm một chút thôi. Nhưng điều kì lạ là mô hình 9 tham số tiên lượng rằng năm thứ 11 sau thành hôn thì mức độ hài lòng giảm như là xe hơi lao dốc xuống núi! Đành rằng mức độ hài lòng có thể suy giảm, nhưng không thể nào giảm đột ngột như mô hình 9 tham số dự báo như thế. Và chúng ta cần phải xem xét lại. Liệu rằng đã có gì đó không đúng chăng???

Nghịch lý: Mô hình giải thích được nhiều dữ liệu trong quá khứ nhất lại là mô hình tiên lượng tồi nhất!

Người mà bạn chọn lựa làm bạn đời là ai???

Mỗi con người trong chúng ta đều có những tiêu chuẩn riêng để lựa chọn người sẽ đi cùng ta suốt cả cuộc đời. Chúng ta thôi không bàn đến những triết lý của ngôn tình như chỉ cần tình yêu là đủ ở đây. Tình yêu là chuyện của con tim, còn tiêu chuẩn để lựa chọn là chuyện của lý trí. Một người thiếu trái tim – người đó chết. Một người mất đi lý trí – người đó chẳng thể sống được. Vậy nên đứng trước những sự lựa chọn lớn lao của cuộc đời, chúng ta cần tuân thủ rất nhiều nguyên tắc, rất nhiều tiêu chuẩn. Tuy nhiên, thực tế lại chứng minh rằng chúng ta đừng lựa chọn quá nhiều, đừng áp đặt lên người khác quá nhiều tiêu chuẩn. Over fitting thể hiện trong việc chọn lựa bạn đời là việc chúng ta cố gắng áp đặt quá nhiều tiêu chuẩn cho người bạn đời của chúng ta nhưng lại quên mất rằng, tất cả những tiêu chuẩn đó chỉ được xem xét trong quá khứ và hiện tại, mà biểu hiện của con người đó ở tương lai như thế nào không ai có thể biết trước được. Và bạn có muốn người bạn đời của mình giống như một mô hình dữ liệu, dù rất tốt khi xem xét ở hiện tại nhưng hoàn toàn bất lực với những thay đổi ở tương lai không. Vậy nên:

Không có tiêu chuẩn để lựa chọn – bạn đang đánh cược với tương lai. Có quá nhiều tiêu chuẩn để lựa chọn – chính tương lai đang đánh cược với bạn

Quá khứ chỉ là kỉ niệm. Đừng sống mãi trong chiếc bong bóng của riêng mình

Vấn đề của Over fitting không hẳn chỉ là một vấn đề trong ngành khoa học máy tính. Đôi khi chúng ta thấy thật sự nó rất đời thường, rất nhân sinh. Có lẽ không ít người trong mỗi chúng ta đang ở trong một chiếc bong bóng vô hình mà không hay biết. Không ít người trong số chúng ta thường có xu hướng nói nhiều về quá khứ hơn là nhắc đến tương lai. Có rất nhiều người thích lặp đi lặp lại những chuyện Xưa rồi Diễm, rằng ngày xưa tôi đã từng rất giỏi, ngày xưa tôi đã từng rất hạnh phúc, ngày xưa tôi đã…..Stop. Chúng ta là những con người đang sống ở hiện tại và tương lai là những điều chưa ai có thể biết trước. Đừng mải mê trong quá khứ vàng son và cũng đừng bi lụy vì một quá khứ lầm lỗi. Dù bạn là ai, bạn có quyền được quyết định chính tương lai của bạn và thay đổi để sống tốt hơn, sống đẹp hơn chưa bao giờ là muộn cả. Và nếu như ranh giới giữa những hạnh phúc hay khổ đau của quá khứ với những điều kì diệu của tương lai cũng mong manh như một bong bóng xà phòng, thị bạn đã sẵn sàng thoát ra khỏi chiếc bong bóng của mình đễ ngắm nhìn một thế giới tốt đẹp hơn chưa???

Đừng quá cầu toàn. Mọi thứ có thể thay đổi và quan trọng là biết thích nghi

Bạn có tin là có những thứ đến Google cũng không có câu trả lời cho bạn không??? Đúng là như vậy đấy, tôi đang nói riêng về phương diện tìm kiếm tri thức thôi, chúng ta dã là quá nhỏ bé rồi. Đến cả Google cũng không thể nói rằng biết hết 100% về mọi lĩnh vực thì huống gì chúng ta. Tôi biết có rất nhiều người rất cầu toàn, sự cầu toàn không phải là một cái gì đó sai trái, nó giúp cho con người ta biết chu toàn bổn phận và trách nhiệm của bản thân mình một cách nghiêm khắc hơn. Tuy nhiên, sự cầu toàn thái quá dễ dẫn con người ta đến cảm giác tiêu cực, cảm giác bị thất bại khi có một mục tiểu không hoàn thành. Có một điều bạn phải chấp nhận rằng:

Chúng ta không bao giờ có thể là người hoàn hảo

Có lẽ bạn thấy một con người rất giỏi về lập trình phần mềm và bạn ngưỡng mộ người đó vì đó là chuyên môn của bạn, nhưng chính bản thân người đó lại rất yếu kém ở một mảng khác ngoài chuyên môn ví dụ như nấu ăn chẳng hạn. Cuộc sống luôn cần những khoảng trống để lấp đầy, nếu một ai đó mà chẳng có một khoảng trống nào để lấp đầy thì họ thật cô đơn biết bao???

Đừng thần tượng hóa ai cả. Hi vọng càng nhiều thì thất vọng càng lớn

Tôi biết có rất nhiều người thực sự rất đáng để chúng ta ngưỡng mộ, có rất nhiều người thực sự rất có khả năng trong một lĩnh vực nào đó và họ xứng đáng được xã hội công nhận. Tuy nhiên có rất nhiều người mắc một căn bệnh mà giới trẻ bây giờ gọi là bênh Fan cuồng. Tôi còn nhớ một câu chuyện kể rằng khi Bi Rain – một diễn viên, một ca sĩ nổi tiếng của Hàn Quốc – trong một lần sang lưu diễn tại Việt Nam đã thu hút rất nhiều Fan hâm mộ trẻ đến cổ vũ. Việc đó thì cũng chẳng có gì là lạ cho đến một ngày người ta đưa lên mạng một đoạn video khi Bi Rain rời đi thì một đám đông các Fan cuồng chạy lên chiếc ghế mà anh ta ngồi thi nhau hít hà chiếc ghế đó như thể hít một thứ sinh khí từ trời ban xuống vậy. Thật là ngô nghê buồn cười, sự thần tượng hóa một ai đó giống như việc chúng ta đang cố gắng tập trung một cách thái quá vào dữ liệu mà chúng ta thu thập được mà quên đi mất bản chất của vấn đề. Thậm chí chính sự thần tượng hóa đó lại gây ra những hệ lụy vô cùng to lớn khi chúng ta biết được sự thật rằng trên thực tế có thể thần tượng của ta không được như chúng ta mong đợi. Thần tượng hóa là một thể hiện của Over fitting trong đời sống con người, nó có thể làm con người ta lạc quan hơn, nhưng cũng có thể làm cho người ta thất vọng hơn khi quay về với thực tại. Vậy nên, tốt nhất là Đừng thần tượng hóa ai cả

 

Và cuối cùng. Hãy học cách sống trung dung

Tôi biết rằng khi đứng trước một vấn đề của cuộc sống, có rất nhiều người hay có thói quen suy nghĩ rất nhiều, đôi khi là phức tạp hóa vấn đề đến mức tối đa. Tuy nhiên suy nghĩ nhiều quá có thể giúp chúng ta giải thích được những gì mình quan sát trong quá khứ (và hiện tại), nhưng nó không hẳn giúp ích chúng ta trong quyết định cho tương lai mà có thể làm cho tình hình rối lên. Trái ngược lại có những người chẳng suy nghĩ, hoặc suy nghĩ rất ít trước một vấn đề. Thái độ mặc đời trôi của những người như vậy cũng không cho chúng ta một cách giải quyết hiệu quả cho tương lai. Hiện tượng đó tương tự như under-fitting trong khoa học dữ liệu, nó bỏ sót và tiên lượng kém chính xác. Thành ra, nghệ thuật của mô hình hoá các mối liên quan là tìm một mô hình không có quá nhiều tham số mà cũng không có quá ít tham số. Nghệ thuật này cũng là nghệ thuật sống: tìm cách sống trung dung.. Hãy sống ôn hòa, bình thản trước mọi vấn đề của cuộc sống, không tầm thường hóa nhưng cũng không cường điều hóa vấn đè.

Cần phải giữ cho ý nghĩ và việc làm luôn luôn ở mức trung hòa, không thái quá, không bất cập và phải cố gắng ở đời theo nhân, nghĩa, lễ, trí, tín, cho thành người quân tửSách Trung Dung – Tử Tư

Lời kết

Từ một vấn đề tưởng chừng đã quá quen thuộc như Over fitting vẫn luôn tiềm ẩn trong nó những triết lý nhân sinh mà chúng ta đáng học hỏi mà cuối cùng tựu chung lại đó là cách sống trung dung trước mọi vấn đề xảy ra trong cuộc đời. Đứng trước những sự việc xảy ra bạn sẽ chọn cách nhìn nhận nó như thế nào. Và đứng trước cả vũ trụ rộng lớn – bạn sẽ chọn bạn là ai???