🌐 Update translations via Co-op Translator

This commit is contained in:
leestott 2025-10-03 13:50:54 +00:00 committed by GitHub
parent 6923c22e49
commit c80fdfd683
48 changed files with 1863 additions and 1743 deletions

View File

@ -13,7 +13,7 @@
"\n",
"> هذا الدفتر هو جزء من [منهج الذكاء الاصطناعي للمبتدئين](http://github.com/microsoft/ai-for-beginners). قم بزيارة المستودع للحصول على مجموعة كاملة من مواد التعلم.\n",
"\n",
"كما ناقشنا سابقًا، يتيح لك بيرسيبترون حل **مشكلة التصنيف الثنائي**، أي تصنيف الأمثلة المدخلة إلى فئتين - يمكننا تسميتهما **إيجابية** و**سلبية**.\n",
"كما ناقشنا، يسمح لك بيرسيبترون بحل **مشكلة التصنيف الثنائي**، أي تصنيف أمثلة الإدخال إلى فئتين - يمكننا تسميتهما **إيجابية** و**سلبية**.\n",
"\n",
"أولاً، دعونا نستورد بعض المكتبات المطلوبة.\n"
]
@ -49,9 +49,9 @@
"source": [
"## مشكلة بسيطة\n",
"\n",
"لنبدأ بمشكلة بسيطة، حيث لدينا ميزتان مدخلتان. على سبيل المثال، في الطب قد نرغب في تصنيف الأورام إلى حميدة وخبيثة، بناءً على حجمها وعمرها.\n",
"لنبدأ بمشكلة بسيطة، حيث لدينا ميزتان إدخاليتان. على سبيل المثال، في الطب قد نرغب في تصنيف الأورام إلى حميدة وخبيثة، بناءً على حجمها وعمرها.\n",
"\n",
"سنقوم بإنشاء مجموعة بيانات تصنيف عشوائية باستخدام وظيفة `make_classification` من مكتبة SciKit Learn:\n"
"سنقوم بإنشاء مجموعة بيانات تصنيف عشوائية باستخدام دالة `make_classification` من مكتبة SciKit Learn:\n"
]
},
{
@ -95,7 +95,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"دعونا نرسم مجموعة البيانات أيضًا:\n"
"دعونا أيضًا نرسم مجموعة البيانات:\n"
]
},
{
@ -154,11 +154,11 @@
"source": [
"## بيرسيبترون\n",
"\n",
"بما أن بيرسيبترون هو مصنف ثنائي، فإن ناتج بيرسيبترون لكل متجه إدخال $x$ سيكون إما +1 أو -1، وذلك بناءً على الفئة. يتم حساب الناتج باستخدام الصيغة:\n",
"نظرًا لأن بيرسيبترون هو مصنف ثنائي، فإن الناتج لكل متجه إدخال $x$ سيكون إما +1 أو -1، اعتمادًا على الفئة. يتم حساب الناتج باستخدام الصيغة:\n",
"\n",
"$$y(\\mathbf{x}) = f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x})$$\n",
"\n",
"حيث $\\mathbf{w}$ هو متجه الأوزان، و$f$ هو دالة تفعيل خطوة:\n",
"حيث $\\mathbf{w}$ هو متجه الأوزان، و $f$ هي دالة تفعيل الخطوة:\n",
"$$\n",
"f(x) = \\begin{cases}\n",
" +1 & x \\geq 0 \\\\\n",
@ -166,7 +166,7 @@
" \\end{cases} \\\\\n",
"$$\n",
"\n",
"ومع ذلك، فإن النموذج الخطي العام يجب أن يحتوي أيضًا على انحياز، أي أنه من المثالي أن نحسب $y$ كـ $y=f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}+\\mathbf{b})$. لتبسيط نموذجنا، يمكننا التخلص من هذا المصطلح الخاص بالانحياز عن طريق إضافة بُعد إضافي إلى ميزات الإدخال لدينا، والذي تكون قيمته دائمًا تساوي 1:\n"
"ومع ذلك، فإن النموذج الخطي العام يجب أن يحتوي أيضًا على انحياز، أي أنه من الناحية المثالية يجب أن نحسب $y$ كـ $y=f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}+\\mathbf{b})$. لتبسيط النموذج، يمكننا التخلص من مصطلح الانحياز عن طريق إضافة بُعد إضافي إلى ميزات الإدخال، والذي يساوي دائمًا 1:\n"
]
},
{
@ -206,20 +206,20 @@
"source": [
"## خوارزمية التدريب\n",
"\n",
"لتدريب الـ perceptron، نحتاج إلى إيجاد الأوزان $\\mathbf{w}$ التي ستقلل من الخطأ. يتم تعريف الخطأ باستخدام **معيار الـ perceptron**:\n",
"لتدريب الـ perceptron، نحتاج إلى إيجاد الأوزان $\\mathbf{w}$ التي ستقلل الخطأ. يتم تعريف الخطأ باستخدام **معيار perceptron**:\n",
"\n",
"$$E(\\mathbf{w}) = -\\sum_{n \\in \\mathcal{M}}\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}_{n}t_{n}$$\n",
"\n",
" * $t_{n} \\in \\{-1, +1\\}$ للقيم السلبية والإيجابية لعينة التدريب على التوالي\n",
" \n",
" * $t_{n} \\in \\{-1, +1\\}$ للقيم السلبية والإيجابية لعينات التدريب، على التوالي\n",
" * $\\mathcal{M}$ - مجموعة الأمثلة التي تم تصنيفها بشكل خاطئ\n",
"\n",
"سنستخدم عملية **الانحدار التدريجي**. بدءًا من أوزان عشوائية ابتدائية $\\mathbf{w}^{(0)}$، سنقوم بتعديل الأوزان في كل خطوة من خطوات التدريب باستخدام التدرج لـ $E$:\n",
" \n",
"سنستخدم عملية **الانحدار التدريجي**. بدءًا بأوزان عشوائية أولية $\\mathbf{w}^{(0)}$، سنقوم بتعديل الأوزان في كل خطوة من خطوات التدريب باستخدام التدرج لـ $E$:\n",
"\n",
"$$\\mathbf{w}^{\\tau + 1}=\\mathbf{w}^{\\tau} - \\eta \\nabla E(\\mathbf{w}) = \\mathbf{w}^{\\tau} + \\eta\\sum_{n \\in \\mathcal{M}}\\mathbf{x}_{n} t_{n}$$\n",
"\n",
"حيث $\\eta$ هو **معدل التعلم**، و $\\tau\\in\\mathbb{N}$ - عدد التكرارات.\n",
"\n",
"لنقم بتعريف هذه الخوارزمية باستخدام Python:\n"
"لنعرّف هذه الخوارزمية باستخدام Python:\n"
]
},
{
@ -271,7 +271,9 @@
{
"cell_type": "markdown",
"metadata": {},
"source": []
"source": [
"الآن دعنا نقوم بتشغيل التدريب على مجموعة البيانات الخاصة بنا:\n"
]
},
{
"cell_type": "code",
@ -309,9 +311,9 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"كما ترى، الدقة الأولية تكون حوالي 50%، لكنها ترتفع بسرعة إلى قيم أعلى قريبة من 90%.\n",
"كما ترى، الدقة الأولية حوالي 50%، لكنها ترتفع بسرعة إلى قيم أعلى قريبة من 90%.\n",
"\n",
"لنقم بتصور كيفية فصل الفئات. وظيفة التصنيف لدينا تبدو كالتالي $\\mathbf{w}^Tx$، وهي تكون أكبر من 0 لفئة واحدة، وأقل من 0 للفئة الأخرى. وبالتالي، يتم تعريف خط الفصل بين الفئات بواسطة $\\mathbf{w}^Tx = 0$. وبما أن لدينا بعدين فقط $x_0$ و $x_1$، فإن معادلة الخط ستكون $w_0x_0+w_1x_1+w_2 = 0$ (تذكر أننا قمنا بتعريف بعد إضافي بشكل صريح $x_2=1$). لنقم برسم هذا الخط:\n"
"دعونا نتصور كيف يتم فصل الفئات. وظيفة التصنيف لدينا تبدو كالتالي $\\mathbf{w}^Tx$، وهي أكبر من 0 لفئة واحدة، وأقل من 0 للفئة الأخرى. وبالتالي، يتم تعريف خط الفصل بين الفئات بواسطة $\\mathbf{w}^Tx = 0$. وبما أن لدينا بعدين فقط $x_0$ و $x_1$، فإن معادلة الخط ستكون $w_0x_0+w_1x_1+w_2 = 0$ (تذكر أننا قمنا بتعريف بعد إضافي بشكل صريح $x_2=1$). دعونا نرسم هذا الخط:\n"
]
},
{
@ -377,9 +379,9 @@
}
},
"source": [
"## تقييم على مجموعة بيانات الاختبار\n",
"## تقييم على مجموعة البيانات الاختبارية\n",
"\n",
"في البداية، قمنا بفصل بعض البيانات لمجموعة بيانات الاختبار. دعونا نرى مدى دقة المصنف الخاص بنا على هذه المجموعة. لتحقيق ذلك، نقوم أيضًا بتوسيع مجموعة بيانات الاختبار بإضافة بُعد إضافي، ثم نضربها في مصفوفة الأوزان، ونتأكد من أن القيمة الناتجة تحمل نفس الإشارة مثل التصنيف (+1 أو -1). بعد ذلك، نجمع جميع القيم المنطقية ونقسمها على طول عينة الاختبار للحصول على الدقة:\n"
"في البداية، قمنا بفصل بعض البيانات لتكون في مجموعة البيانات الاختبارية. دعونا نرى مدى دقة المصنف الخاص بنا على هذه المجموعة. للقيام بذلك، نقوم أيضًا بتوسيع مجموعة البيانات الاختبارية بإضافة بُعد إضافي، ثم نضربها في مصفوفة الأوزان، ونتأكد من أن القيمة الناتجة تحمل نفس الإشارة مثل التصنيف (+1 أو -1). بعد ذلك، نجمع جميع القيم البوليانية ونقسمها على طول عينة الاختبار للحصول على الدقة:\n"
]
},
{
@ -420,7 +422,7 @@
"source": [
"## مراقبة عملية التدريب\n",
"\n",
"لقد رأينا سابقًا كيف تنخفض الدقة أثناء التدريب. سيكون من الجيد رؤية كيف تتغير خط الفصل خلال عملية التدريب. الكود أدناه سيقوم بتصور كل شيء على رسم بياني واحد، وستتمكن من تحريك شريط التمرير لـ\"السفر عبر الزمن\" خلال عملية التدريب.\n"
"لقد رأينا سابقًا كيف تنخفض الدقة أثناء التدريب. سيكون من الجيد رؤية كيف تتغير خط الفصل أثناء التدريب. الكود أدناه سيقوم بتصور كل شيء على رسم بياني واحد، وستتمكن من تحريك شريط التمرير لـ\"السفر عبر الزمن\" خلال عملية التدريب.\n"
]
},
{
@ -525,18 +527,18 @@
}
},
"source": [
"## قيود بيرسيبترون\n",
"## قيود البرسيبترون\n",
"\n",
"كما رأيت أعلاه، فإن بيرسيبترون هو **مصنف خطي**. يمكنه التمييز بين فئتين بشكل جيد إذا كانتا **قابلتين للفصل خطيًا**، أي يمكن فصلهما بخط مستقيم. أما إذا لم يكن الأمر كذلك، فلن تتقارب عملية تدريب بيرسيبترون.\n",
"كما رأيت أعلاه، البرسيبترون هو **مصنف خطي**. يمكنه التمييز بين فئتين بشكل جيد إذا كانتا **قابلتين للفصل خطيًا**، أي يمكن فصلهما بخط مستقيم. خلاف ذلك، لن تتقارب عملية تدريب البرسيبترون.\n",
"\n",
"أحد الأمثلة الأكثر وضوحًا على مشكلة لا يمكن حلها باستخدام بيرسيبترون هي ما يُعرف بـ **مشكلة XOR**. نريد أن يتعلم بيرسيبترون دالة XOR المنطقية، والتي تحتوي على جدول الحقيقة التالي:\n",
"أحد الأمثلة الأكثر وضوحًا على مشكلة لا يمكن حلها بواسطة البرسيبترون هي ما يُعرف بـ **مشكلة XOR**. نريد أن يتعلم البرسيبترون وظيفة XOR المنطقية، والتي تحتوي على جدول الحقيقة التالي:\n",
"\n",
"| | 0 | 1 |\n",
"|---|---|---|\n",
"| 0 | 0 | 1 | \n",
"| 1 | 1 | 0 |\n",
"\n",
"دعونا نحاول القيام بذلك! سنقوم بملء جميع عينات التدريب الإيجابية والسلبية يدويًا، ثم نستدعي دالة التدريب التي قمنا بتعريفها أعلاه:\n"
"لنحاول القيام بذلك! سنقوم يدويًا بملء جميع عينات التدريب الإيجابية والسلبية، ثم نستدعي وظيفة التدريب التي تم تعريفها أعلاه:\n"
]
},
{
@ -603,19 +605,19 @@
}
},
"source": [
"كما ترى من الرسم البياني أعلاه، فإن الدقة لا تتجاوز أبدًا 75%، لأنه من المستحيل رسم خط مستقيم بطريقة تجعل جميع الأمثلة الممكنة صحيحة.\n",
"كما ترى من الرسم البياني أعلاه، فإن الدقة لا تتجاوز أبدًا 75%، لأن رسم خط مستقيم بحيث يشمل جميع الأمثلة الممكنة بشكل صحيح أمر مستحيل.\n",
"\n",
"مشكلة XOR هي مثال كلاسيكي على قيود الـ perceptron، وقد أشار إليها مارفن مينسكي وسيمور بابيرت في عام 1969 في كتابهما [Perceptrons](https://en.wikipedia.org/wiki/Perceptrons_(book)). هذا الاكتشاف حدّ من الأبحاث في مجال الشبكات العصبية لمدة تقارب 10 سنوات، على الرغم من أنه - وكما سنرى في القسم التالي من دورتنا - فإن perceptrons متعددة الطبقات قادرة تمامًا على حل مثل هذه المشكلات.\n",
"مشكلة XOR هي مثال كلاسيكي على قيود perceptron، وقد أشار إليها مارفن مينسكي وسيمور بابيرت في عام 1969 في كتابهما [Perceptrons](https://en.wikipedia.org/wiki/Perceptrons_(book)). هذا الاكتشاف حدّ من الأبحاث في مجال الشبكات العصبية لمدة تقارب 10 سنوات، على الرغم من أنه - وكما سنرى في القسم التالي من دورتنا - فإن perceptrons متعددة الطبقات قادرة تمامًا على حل مثل هذه المشكلات.\n",
"\n",
"## مثال معقد - MNIST\n",
"\n",
"على الرغم من أن perceptron لا يمكنه حل مشكلة XOR، إلا أنه يمكنه حل العديد من المشكلات الأكثر تعقيدًا، مثل التعرف على الأحرف المكتوبة بخط اليد.\n",
"\n",
"مجموعة بيانات تُستخدم غالبًا عند تعلم تقنيات التعلم الآلي تُسمى [MNIST](https://en.wikipedia.org/wiki/MNIST_database). تم إنشاؤها بواسطة المعهد الوطني للمعايير والتكنولوجيا المعدل، وتحتوي على مجموعة تدريب تضم 60000 رقم مكتوب بخط اليد، تم جمعها من حوالي 250 طالبًا وموظفًا في المعهد. كما توجد مجموعة اختبار تحتوي على 10000 رقم، تم جمعها من أفراد مختلفين.\n",
"مجموعة بيانات تُستخدم غالبًا عند تعلم تقنيات التعلم الآلي تُسمى [MNIST](https://en.wikipedia.org/wiki/MNIST_database). تم إنشاؤها بواسطة المعهد الوطني للمعايير والتكنولوجيا المعدل، وتحتوي على مجموعة تدريب تضم 60000 رقم مكتوب بخط اليد، تم جمعها من حوالي 250 طالبًا وموظفًا في المعهد. كما توجد مجموعة اختبار تضم 10000 رقم، تم جمعها من أفراد مختلفين.\n",
"\n",
"جميع الأرقام ممثلة بصور رمادية بمقاس 28x28 بكسل.\n",
"\n",
"> مجموعة بيانات MNIST متاحة كمنافسة تدريبية على [Kaggle](https://www.kaggle.com/c/digit-recognizer)، وهو موقع يستضيف مسابقات ومنافسات في مجال التعلم الآلي. بمجرد أن تتعلم كيفية تصنيف أرقام MNIST، يمكنك تقديم حلك على Kaggle لمعرفة كيف يتم تقييمه بين المشاركين الآخرين.\n",
"> مجموعة بيانات MNIST متوفرة كمسابقة تدريبية على [Kaggle](https://www.kaggle.com/c/digit-recognizer)، وهو موقع يستضيف مسابقات وتحديات التعلم الآلي. بمجرد أن تتعلم كيفية تصنيف أرقام MNIST، يمكنك تقديم حلك على Kaggle لمعرفة كيف يتم تقييمه بين المشاركين الآخرين.\n",
"\n",
"نبدأ بتحميل مجموعة بيانات MNIST:\n"
]
@ -642,7 +644,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"لنقم الآن برسم مجموعة البيانات:\n"
":الآن دعونا نرسم مجموعة البيانات\n"
]
},
{
@ -693,7 +695,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"لأن بيرسيبترون هو مصنف ثنائي، سنقتصر مشكلتنا على التعرف على رقمين فقط. الدالة أدناه ستملأ مصفوفات العينات الإيجابية والسلبية برقمين معينين (وستعرض أيضًا عينات من هذه الأرقام للتوضيح).\n"
"لأن بيرسيبترون هو مصنف ثنائي، سنقتصر مشكلتنا على التعرف على رقمين فقط. الوظيفة أدناه ستقوم بملء مصفوفات العينات الإيجابية والسلبية برقمين محددين (وستعرض أيضًا عينات من تلك الأرقام للتوضيح).\n"
]
},
{
@ -829,13 +831,13 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"يرجى ملاحظة كيف ترتفع الدقة بسرعة لتصل إلى ما يقرب من 100%.\n",
"يرجى ملاحظة كيف ترتفع الدقة إلى ما يقارب 100% بسرعة كبيرة.\n",
"\n",
"يرجى تحريك المؤشر إلى موقع ما نحو نهاية التدريب، وملاحظة مصفوفة الأوزان المرسومة على اليسار. هذه المصفوفة ستساعدك على فهم كيفية عمل البرسيبترون فعليًا. يمكنك رؤية قيم الأوزان العالية في منتصف المجال، والتي تتوافق مع البكسلات التي تكون عادةً موجودة للرقم 1، وقيم سلبية منخفضة على الجوانب، حيث توجد أجزاء من الرقم 0. لذلك، إذا كان الرقم المعروض على البرسيبترون هو بالفعل 1، فإن الجزء الأوسط منه سيتم ضربه بقيم عالية، مما ينتج عنه نتيجة إيجابية. وعلى العكس، عندما يلاحظ البرسيبترون الرقم 0، سيتم ضرب البكسلات المقابلة بأرقام سلبية.\n",
"يرجى تحريك شريط التمرير إلى موقع ما قرب نهاية عملية التدريب، وملاحظة مصفوفة الأوزان المعروضة على اليسار. هذه المصفوفة ستساعدك على فهم كيفية عمل الـ perceptron فعليًا. يمكنك رؤية القيم العالية للأوزان في منتصف الحقل، والتي تتوافق مع البكسلات التي تكون عادةً موجودة للرقم 1، والقيم السلبية المنخفضة على الجوانب، حيث توجد أجزاء من الرقم 0. لذلك، إذا كان الرقم المعروض على الـ perceptron هو في الواقع 1، فإن الجزء الأوسط منه سيتم ضربه بقيم عالية، مما ينتج عنه نتيجة إيجابية. وعلى العكس، عندما يلاحظ الـ perceptron الرقم 0، فإن البكسلات المقابلة سيتم ضربها بأرقام سلبية.\n",
"\n",
"> قد تلاحظ أنه إذا أعطينا البرسيبترون الرقم 1 وكان منحرفًا قليلاً أفقيًا، بحيث تشغل بكسلاته المكان الذي توجد فيه الأجزاء العمودية للرقم 0، فقد نحصل على نتيجة غير صحيحة. نظرًا لأن طبيعة مجموعة بيانات MNIST هي أن جميع الأرقام تكون متمركزة وموضوعة بشكل صحيح، ويعتمد البرسيبترون على ذلك للتمييز بين الأرقام.\n",
"> قد تلاحظ أنه إذا قمنا بعرض الرقم 1 على الـ perceptron وكان الرقم منحرفًا أفقيًا قليلاً بحيث تشغل بكسلاته المكان الذي توجد فيه الأجزاء الرأسية للرقم 0، فقد نحصل على نتيجة غير صحيحة. وذلك لأن طبيعة مجموعة بيانات MNIST هي أن جميع الأرقام تكون متمركزة ومضبوطة بشكل صحيح، ويعتمد الـ perceptron على هذا التمركز للتمييز بين الأرقام.\n",
"\n",
"الآن دعونا نجرب أرقامًا مختلفة:\n"
"والآن، دعونا نجرب أرقامًا مختلفة:\n"
]
},
{
@ -909,13 +911,13 @@
}
},
"source": [
"## النقاش\n",
"## المناقشة\n",
"\n",
"لسبب ما، لا يمكن فصل الرقمين 2 و5 بسهولة. على الرغم من أننا نحصل على دقة عالية نسبيًا (أكثر من 85%)، يمكننا بوضوح ملاحظة كيف يتوقف perceptron عن التعلم في مرحلة معينة.\n",
"لسبب ما، الرقمين 2 و5 ليس من السهل فصلهم. على الرغم من أننا نحصل على دقة عالية نسبيًا (أكثر من 85%)، يمكننا بوضوح رؤية كيف يتوقف perceptron عن التعلم في مرحلة معينة.\n",
"\n",
"لفهم سبب حدوث ذلك، يمكننا محاولة استخدام [تحليل المكونات الرئيسية](https://en.wikipedia.org/wiki/Principal_component_analysis) (PCA). وهي تقنية تعلم آلي تُستخدم لتقليل أبعاد مجموعة البيانات المدخلة، بطريقة تتيح الحصول على أفضل فصل بين الفئات.\n",
"لفهم سبب حدوث ذلك، يمكننا محاولة استخدام [تحليل المكونات الرئيسية](https://en.wikipedia.org/wiki/Principal_component_analysis) (PCA). إنها تقنية تعلم آلي تُستخدم لتقليل الأبعاد في مجموعة البيانات المدخلة، بطريقة تتيح الحصول على أفضل فصل بين الفئات.\n",
"\n",
"في حالتنا، تحتوي الصورة المدخلة على 784 بكسل (ميزات الإدخال)، ونريد استخدام PCA لتقليل عدد المعاملات إلى 2 فقط، حتى نتمكن من رسمها على الرسم البياني. هذان المعاملان سيكونان مزيجًا خطيًا من الميزات الأصلية، ويمكننا اعتبار هذه العملية بمثابة \"تدوير\" فضائنا الأصلي ذي الأبعاد الـ 784 ومراقبة إسقاطه على فضاء ثنائي الأبعاد، حتى نحصل على أفضل رؤية تفصل بين الفئات.\n"
"في حالتنا، تحتوي الصورة المدخلة على 784 بكسل (ميزات مدخلة)، ونريد استخدام PCA لتقليل عدد المعلمات إلى اثنتين فقط، حتى نتمكن من رسمهما على الرسم البياني. هاتان المعلمتان ستكونان مزيجًا خطيًا من الميزات الأصلية، ويمكننا اعتبار هذه العملية بمثابة \"تدوير\" فضائنا الأصلي ذي الأبعاد الـ784 ومراقبة إسقاطه إلى فضاء ثنائي الأبعاد، حتى نحصل على أفضل رؤية تفصل بين الفئات.\n"
]
},
{
@ -1025,17 +1027,17 @@
}
},
"source": [
"كما ترى، يمكن فصل الرقمين 0 و 1 بوضوح بواسطة خط مستقيم. يشير هذا إلى أنه في الفضاء الأصلي ذو الأبعاد الـ784، النقاط التي تمثل الأرقام قابلة للفصل خطيًا أيضًا. أما في حالة الرقمين 2 و 5، لا يمكننا العثور على إسقاط جيد يفصل بين الأرقام بوضوح، وبالتالي هناك بعض الحالات التي يتم فيها التصنيف بشكل خاطئ.\n",
"كما ترى، يمكن فصل الرقمين 0 و1 بوضوح باستخدام خط مستقيم. يشير هذا إلى أنه في الفضاء الأصلي المكون من 784 بُعدًا، يمكن فصل النقاط التي تمثل الأرقام بشكل خطي أيضًا. أما في حالة الرقمين 2 و5، فلا يمكننا العثور على إسقاط جيد يفصل بين الأرقام بوضوح، وبالتالي هناك بعض الحالات التي يحدث فيها تصنيف خاطئ.\n",
"\n",
"> لاحقًا في هذه الدورة، سنتعلم كيفية إنشاء مصنفات غير خطية باستخدام الشبكات العصبية، وكيفية التعامل مع مشكلة عدم محاذاة الأرقام بشكل صحيح. قريبًا جدًا سنصل إلى دقة تتجاوز 99% في تصنيف أرقام MNIST، مع تصنيفها إلى 10 فئات مختلفة.\n",
"> لاحقًا في هذه الدورة، سنتعلم كيفية إنشاء مصنفات غير خطية باستخدام الشبكات العصبية، وكيفية التعامل مع مشكلة عدم محاذاة الأرقام بشكل صحيح. قريبًا جدًا، سنصل إلى دقة تتجاوز 99% في تصنيف أرقام MNIST، مع تصنيفها إلى 10 فئات مختلفة.\n",
"\n",
"## النقاط الرئيسية\n",
"\n",
" * تعلمنا عن أبسط بنية للشبكات العصبية - وهي الإدراك أحادي الطبقة.\n",
" * قمنا بتنفيذ الإدراك \"يدويًا\"، باستخدام إجراء تدريب بسيط يعتمد على الانحدار التدريجي.\n",
" * على الرغم من بساطته، يمكن للإدراك أحادي الطبقة حل مشاكل معقدة نسبيًا مثل التعرف على الأرقام المكتوبة بخط اليد.\n",
" * الإدراك أحادي الطبقة هو مصنف خطي، وبالتالي يوفر نفس قوة التصنيف التي تقدمها الانحدار اللوجستي.\n",
" * في فضاء العينات، يمكن للإدراك فصل فئتين من بيانات الإدخال باستخدام مستوى فوقي.\n"
" * تعلمنا عن أبسط بنية للشبكات العصبية - وهي طبقة واحدة من Perceptron.\n",
" * قمنا بتنفيذ Perceptron \"يدويًا\"، باستخدام إجراء تدريب بسيط يعتمد على الانحدار التدريجي.\n",
" * على الرغم من البساطة، يمكن لـ Perceptron ذو الطبقة الواحدة حل مشاكل معقدة نسبيًا مثل التعرف على الأرقام المكتوبة بخط اليد.\n",
" * يعتبر Perceptron ذو الطبقة الواحدة مصنفًا خطيًا، وبالتالي يوفر نفس قوة التصنيف التي توفرها الانحدار اللوجستي.\n",
" * في فضاء العينة، يمكن لـ Perceptron فصل فئتين من بيانات الإدخال باستخدام مستوى فائق (Hyperplane).\n"
]
},
{
@ -1044,14 +1046,14 @@
"source": [
"## الشكر والتقدير\n",
"\n",
"هذا الدفتر هو جزء من [منهج الذكاء الاصطناعي للمبتدئين](http://github.com/microsoft/ai-for-beginners)، وقد تم إعداده بواسطة [دميتري سوشنيكوف](http://soshnikov.com). وهو مستوحى من ورشة عمل الشبكات العصبية في Microsoft Research Cambridge. بعض الأكواد والمواد التوضيحية مأخوذة من عروض تقديمية لـ [كاتيا هوفمان](https://www.microsoft.com/en-us/research/people/kahofman/)، [ماثيو جونسون](https://www.microsoft.com/en-us/research/people/matjoh/) و[ريوتو توميوكا](https://www.microsoft.com/en-us/research/people/ryoto/)، ومن مستودع [NeuroWorkshop](http://github.com/shwars/NeuroWorkshop).\n"
"هذا الدفتر هو جزء من [منهج الذكاء الاصطناعي للمبتدئين](http://github.com/microsoft/ai-for-beginners)، وقد تم إعداده بواسطة [دميتري سوشنيكوف](http://soshnikov.com). وهو مستوحى من ورشة عمل الشبكات العصبية في Microsoft Research Cambridge. تم أخذ بعض الأكواد والمواد التوضيحية من عروض تقديمية لـ [كاتيا هوفمان](https://www.microsoft.com/en-us/research/people/kahofman/)، [ماثيو جونسون](https://www.microsoft.com/en-us/research/people/matjoh/) و[ريوتو توميوكا](https://www.microsoft.com/en-us/research/people/ryoto/)، ومن مستودع [NeuroWorkshop](http://github.com/shwars/NeuroWorkshop).\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**إخلاء المسؤولية**: \nتمت ترجمة هذا المستند باستخدام خدمة الترجمة الآلية [Co-op Translator](https://github.com/Azure/co-op-translator). بينما نسعى لتحقيق الدقة، يرجى العلم أن الترجمات الآلية قد تحتوي على أخطاء أو معلومات غير دقيقة. يجب اعتبار المستند الأصلي بلغته الأصلية هو المصدر الموثوق. للحصول على معلومات حساسة أو هامة، يُوصى بالاستعانة بترجمة بشرية احترافية. نحن غير مسؤولين عن أي سوء فهم أو تفسيرات خاطئة تنشأ عن استخدام هذه الترجمة.\n"
"\n---\n\n**إخلاء المسؤولية**: \nتم ترجمة هذا المستند باستخدام خدمة الترجمة بالذكاء الاصطناعي [Co-op Translator](https://github.com/Azure/co-op-translator). بينما نسعى لتحقيق الدقة، يرجى العلم أن الترجمات الآلية قد تحتوي على أخطاء أو معلومات غير دقيقة. يجب اعتبار المستند الأصلي بلغته الأصلية المصدر الموثوق. للحصول على معلومات حاسمة، يُوصى بالاستعانة بترجمة بشرية احترافية. نحن غير مسؤولين عن أي سوء فهم أو تفسيرات خاطئة ناتجة عن استخدام هذه الترجمة.\n"
]
}
],
@ -1080,8 +1082,8 @@
"start_slideshow_at": "selected"
},
"coopTranslator": {
"original_hash": "914fc55f59efc7e17b8130d4033ac617",
"translation_date": "2025-08-29T06:38:50+00:00",
"original_hash": "d67e5b54ba20b507aa88d71aa3d042d8",
"translation_date": "2025-10-03T13:07:49+00:00",
"source_file": "lessons/3-NeuralNetworks/03-Perceptron/Perceptron.ipynb",
"language_code": "ar"
}

View File

@ -49,7 +49,7 @@
"source": [
"## Примерен проблем\n",
"\n",
"Нека започнем с примерен проблем, при който имаме две входни характеристики. Например, в медицината може да искаме да класифицираме туморите като доброкачествени или злокачествени в зависимост от техния размер и възраст.\n",
"За начало, нека разгледаме примерен проблем, при който имаме две входни характеристики. Например, в медицината може да искаме да класифицираме туморите като доброкачествени и злокачествени, в зависимост от техния размер и възраст.\n",
"\n",
"Ще генерираме случайна класификационна база данни, използвайки функцията `make_classification` от библиотеката SciKit Learn:\n"
]
@ -95,7 +95,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Нека също да начертаем набора от данни:\n"
"Нека също така начертаем набора от данни:\n"
]
},
{
@ -158,7 +158,7 @@
"\n",
"$$y(\\mathbf{x}) = f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x})$$\n",
"\n",
"където $\\mathbf{w}$ е вектор на теглата, а $f$ е стъпкова активационна функция:\n",
"където $\\mathbf{w}$ е вектор на теглата, а $f$ е стъпковата активационна функция:\n",
"$$\n",
"f(x) = \\begin{cases}\n",
" +1 & x \\geq 0 \\\\\n",
@ -271,7 +271,9 @@
{
"cell_type": "markdown",
"metadata": {},
"source": []
"source": [
"Сега нека стартираме обучението върху нашия набор от данни:\n"
]
},
{
"cell_type": "code",
@ -309,9 +311,9 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Както виждате, първоначалната точност е около 50%, но бързо се увеличава до по-високи стойности, близки до 90%.\n",
"Както виждате, началната точност е около 50%, но бързо се увеличава до по-високи стойности, близки до 90%.\n",
"\n",
"Нека визуализираме как се разделят класовете. Нашата функция за класификация изглежда като $\\mathbf{w}^Tx$, и тя е по-голяма от 0 за един клас, а е под 0 за другия. Следователно, линията на разделяне на класовете се определя от $\\mathbf{w}^Tx = 0$. Тъй като имаме само две измерения $x_0$ и $x_1$, уравнението за линията би било $w_0x_0+w_1x_1+w_2 = 0$ (помнете, че изрично сме дефинирали допълнително измерение $x_2=1$). Нека начертаем тази линия:\n"
"Нека визуализираме как се разделят класовете. Нашата функция за класификация изглежда като $\\mathbf{w}^Tx$, и тя е по-голяма от 0 за един клас, а е под 0 за друг. Следователно, линията за разделяне на класовете се определя от $\\mathbf{w}^Tx = 0$. Тъй като имаме само две измерения $x_0$ и $x_1$, уравнението за линията би било $w_0x_0+w_1x_1+w_2 = 0$ (не забравяйте, че изрично сме дефинирали допълнително измерение $x_2=1$). Нека начертаем тази линия:\n"
]
},
{
@ -420,7 +422,7 @@
"source": [
"## Наблюдение на процеса на обучение\n",
"\n",
"Вече видяхме как точността намалява по време на обучението. Би било интересно да видим как се променя линията на разделяне по време на обучението. Кодът по-долу ще визуализира всичко на един график, като ще можете да местите плъзгача, за да \"пътувате във времето\" през процеса на обучение.\n"
"Вече видяхме как точността намалява по време на обучението. Би било интересно да видим как се променя линията на разделяне по време на обучението. Кодът по-долу ще визуализира всичко на един график, и ще можете да използвате плъзгача, за да \"пътувате във времето\" през процеса на обучение.\n"
]
},
{
@ -525,7 +527,7 @@
}
},
"source": [
"## Ограничения на перцептрона\n",
"## Ограничения на Перцептрона\n",
"\n",
"Както видяхте по-горе, перцептронът е **линеен класификатор**. Той може добре да различава между два класа, ако те са **линейно разделими**, т.е. могат да бъдат разделени с права линия. В противен случай процесът на обучение на перцептрона няма да се сближи.\n",
"\n",
@ -536,7 +538,7 @@
"| 0 | 0 | 1 | \n",
"| 1 | 1 | 0 |\n",
"\n",
"Нека опитаме да го направим! Ще попълним ръчно всички положителни и отрицателни тренировъчни примери и след това ще извикаме нашата функция train, дефинирана по-горе:\n"
"Нека опитаме да го направим! Ще попълним ръчно всички положителни и отрицателни тренировъчни примери и след това ще извикаме нашата функция за обучение, дефинирана по-горе:\n"
]
},
{
@ -603,21 +605,21 @@
}
},
"source": [
"Както се вижда от графиката по-горе, точността никога не надвишава 75%, защото е невъзможно да се начертае права линия, която да обхване всички възможни примери правилно.\n",
"Както можете да видите от графиката по-горе, точността никога не надвишава 75%, защото е невъзможно да се начертае права линия така, че да се обхванат всички възможни примери правилно.\n",
"\n",
"Проблемът с XOR е класически пример за ограниченията на перцептрона и е посочен от Марвин Мински и Сиймур Пейпърт през 1969 г. в тяхната книга [Perceptrons](https://en.wikipedia.org/wiki/Perceptrons_(book)). Това наблюдение ограничава изследванията в областта на невронните мрежи за почти 10 години, въпреки че - както ще видим в следващата секция на нашия курс - многослойните перцептрони са напълно способни да решават такива проблеми.\n",
"Проблемът с XOR е класически пример за ограниченията на перцептрона и беше посочен от Марвин Мински и Сиймур Пейпърт през 1969 г. в тяхната книга [Perceptrons](https://en.wikipedia.org/wiki/Perceptrons_(book)). Това наблюдение ограничи изследванията в областта на невронните мрежи за почти 10 години, въпреки че - както ще видим в следващата секция на нашия курс - многослойните перцептрони са напълно способни да решават такива проблеми.\n",
"\n",
"## Сложен пример - MNIST\n",
"\n",
"Въпреки че перцептронът не може да реши проблема с XOR, той може да решава много по-сложни задачи, като например разпознаване на ръкописни символи.\n",
"\n",
"Датасет, който често се използва при усвояване на машинното обучение, се нарича [MNIST](https://en.wikipedia.org/wiki/MNIST_database). Той е създаден от Модифицирания национален институт за стандарти и технологии и съдържа тренировъчен набор от 60 000 ръкописни цифри, събрани от около 250 студенти и служители на института. Има и тестов набор от 10 000 цифри, събрани от различни индивиди.\n",
"Един набор от данни, който често се използва при усвояване на машинното обучение, се нарича [MNIST](https://en.wikipedia.org/wiki/MNIST_database). Той е създаден от Модифицирания Национален Институт за Стандарти и Технологии и съдържа тренировъчен набор от 60 000 ръкописни цифри, събрани от около 250 студенти и служители на института. Съществува и тестов набор от данни с 10 000 цифри, събрани от различни индивиди.\n",
"\n",
"Всички цифри са представени чрез изображения в сиви тонове с размер 28x28 пиксела.\n",
"\n",
"> Датасетът MNIST е достъпен като тренировъчно състезание на [Kaggle](https://www.kaggle.com/c/digit-recognizer), сайт, който хоства състезания и конкурси по машинно обучение. След като се научите как да класифицирате цифрите от MNIST, можете да изпратите своето решение в Kaggle, за да видите как се оценява сред другите участници.\n",
"> Наборът от данни MNIST е достъпен като тренировъчно състезание на [Kaggle](https://www.kaggle.com/c/digit-recognizer), сайт, който организира състезания и конкурси по машинно обучение. След като се научите да класифицирате цифрите от MNIST, можете да изпратите своето решение на Kaggle, за да видите как се оценява сред другите участници.\n",
"\n",
"Започваме с зареждането на датасета MNIST:\n"
"Започваме с зареждането на набора от данни MNIST:\n"
]
},
{
@ -693,7 +695,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Тъй като перцептронът е бинарен класификатор, ще ограничим задачата си до разпознаване само на две цифри. Функцията по-долу ще попълни масивите за положителни и отрицателни примери с две дадени цифри (и също така ще покаже примери за тези цифри за яснота).\n"
"Тъй като перцептронът е бинарен класификатор, ще ограничим проблема си до разпознаване само на две цифри. Функцията по-долу ще попълни масивите за положителни и отрицателни примери с две дадени цифри (и също така ще покаже примери за тези цифри за яснота).\n"
]
},
{
@ -829,11 +831,11 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Моля, обърнете внимание как точността се увеличава почти до 100% много бързо.\n",
"Моля, обърнете внимание как точността се повишава почти до 100% много бързо.\n",
"\n",
"Моля, преместете плъзгача към някаква позиция към края на обучението и наблюдавайте матрицата на теглата, изобразена отляво. Тази матрица ще ви позволи да разберете как всъщност работи перцептронът. Можете да видите високите стойности на теглата в средата на полето, които съответстват на пиксели, които обикновено присъстват за цифрата 1, и ниските отрицателни стойности отстрани, където се намират части от цифрата 0. Така че, ако цифрата, представена на перцептрона, всъщност е 1, средната част от нея ще бъде умножена с високи стойности, което ще произведе положителен резултат. Обратно, когато перцептронът наблюдава 0, съответните пиксели ще бъдат умножени с отрицателни числа.\n",
"Моля, преместете плъзгача към някоя позиция към края на обучението и наблюдавайте матрицата на теглата, изобразена отляво. Тази матрица ще ви помогне да разберете как всъщност работи перцептронът. Можете да видите високите стойности на теглата в средата на полето, които съответстват на пикселите, които обикновено присъстват за цифрата 1, и ниските отрицателни стойности отстрани, където се намират части от цифрата 0. Така че, ако цифрата, представена на перцептрона, наистина е 1, средната част от нея ще бъде умножена с високи стойности, което ще произведе положителен резултат. Обратно, когато перцептронът наблюдава 0, съответните пиксели ще бъдат умножени с отрицателни числа.\n",
"\n",
"> Може да забележите, че ако дадем на нашия перцептрон цифра 1, леко изместена хоризонтално, така че нейните пиксели да заемат място, където има вертикални части на 0, може да получим неправилен резултат. Тъй като природата на нашия MNIST набор от данни е такава, че всички цифри са центрирани и правилно позиционирани, перцептронът разчита на това, за да различава цифрите.\n",
"> Може да забележите, че ако дадем на нашия перцептрон цифра 1, леко изместена хоризонтално, така че нейните пиксели да заемат място, където има вертикални части от цифрата 0, може да получим неправилен резултат. Тъй като природата на нашия MNIST набор от данни е такава, че всички цифри са центрирани и правилно позиционирани, перцептронът разчита на това, за да различава цифрите.\n",
"\n",
"Сега нека опитаме с различни цифри:\n"
]
@ -909,13 +911,13 @@
}
},
"source": [
"## Дискусия\n",
"## Обсъждане\n",
"\n",
"По някаква причина, 2 и 5 не са толкова лесно разделими. Въпреки че постигаме сравнително висока точност (над 85%), ясно се вижда как перцептронът спира да учи в даден момент.\n",
"\n",
"За да разберем защо се случва това, можем да опитаме да използваме [Principal Component Analysis](https://en.wikipedia.org/wiki/Principal_component_analysis) (PCA). Това е техника за машинно обучение, която се използва за намаляване на размерността на входния набор от данни, така че да се постигне най-добра разделимост между класовете.\n",
"За да разберем защо се случва това, можем да опитаме да използваме [Анализ на главните компоненти](https://en.wikipedia.org/wiki/Principal_component_analysis) (PCA). Това е техника от машинното обучение, която се използва за намаляване на размерността на входния набор от данни, така че да се постигне най-добрата разделимост между класовете.\n",
"\n",
"В нашия случай, входното изображение има 784 пиксела (входни характеристики), и искаме да използваме PCA, за да намалим броя на параметрите само до 2, за да можем да ги изобразим на графика. Тези два параметъра ще бъдат линейна комбинация от оригиналните характеристики, и можем да разглеждаме този процес като \"завъртане\" на нашето оригинално 784-измерно пространство и наблюдаване на неговата проекция в 2D-пространство, докато не получим най-добрата гледна точка, която разделя класовете.\n"
"В нашия случай, входното изображение има 784 пиксела (входни характеристики), и искаме да използваме PCA, за да намалим броя на параметрите само до 2, за да можем да ги изобразим на графика. Тези два параметъра ще бъдат линейна комбинация от оригиналните характеристики, и можем да разглеждаме този процес като \"завъртане\" на нашето оригинално пространство с 784 измерения и наблюдение на неговата проекция в 2D-пространството, докато получим най-добрия изглед, който разделя класовете.\n"
]
},
{
@ -1025,17 +1027,17 @@
}
},
"source": [
"Както виждате, 0 и 1 могат ясно да бъдат разделени с права линия. Това показва, че в оригиналното 784-мерно пространство точките, съответстващи на цифрите, също са линейно разделими. В случая с 2 и 5 не можем да намерим добра проекция, която да раздели цифрите ясно, и затова има случаи на неправилна класификация.\n",
"Както виждате, 0 и 1 могат ясно да бъдат разделени с права линия. Това показва, че в оригиналното 784-измерно пространство точките, съответстващи на цифрите, също са линейно разделими. В случая с 2 и 5 не можем да намерим добра проекция, която да раздели цифрите ясно, и затова има случаи на грешна класификация.\n",
"\n",
"> По-късно в този курс ще научим как да създаваме нелинейни класификатори, използвайки невронни мрежи, и как да се справяме с проблема, когато цифрите не са правилно подравнени. Много скоро ще постигнем над 99% точност при класификацията на цифрите от MNIST, като ги класифицираме в 10 различни класа.\n",
"\n",
"## Основни изводи\n",
"\n",
" * Научихме за най-простата архитектура на невронна мрежа - еднослоен перцептрон.\n",
" * Имплементирахме перцептрона \"ръчно\", използвайки проста процедура за обучение, базирана на градиентен спуск.\n",
" * Реализирахме перцептрона \"на ръка\", използвайки проста тренировъчна процедура, базирана на градиентен спуск.\n",
" * Въпреки своята простота, еднослойният перцептрон може да решава доста сложни задачи за разпознаване на ръкописни цифри.\n",
" * Еднослойният перцептрон е линеен класификатор и следователно предоставя същата класификационна мощ като логистичната регресия.\n",
" * В пространството на примерите перцептронът може да разделя два класа входни данни, използвайки хиперплоскост.\n"
" * Еднослойният перцептрон е линеен класификатор и следователно предоставя същата класификационна мощност като логистичната регресия.\n",
" * В пространството на примерите перцептронът може да раздели два класа входни данни, използвайки хиперплоскост.\n"
]
},
{
@ -1051,7 +1053,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Отказ от отговорност**: \nТози документ е преведен с помощта на AI услуга за превод [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля, имайте предвид, че автоматизираните преводи може да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Ние не носим отговорност за каквито и да е недоразумения или погрешни интерпретации, произтичащи от използването на този превод.\n"
"\n---\n\n**Отказ от отговорност**: \nТози документ е преведен с помощта на AI услуга за превод [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля, имайте предвид, че автоматизираните преводи може да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Не носим отговорност за недоразумения или погрешни интерпретации, произтичащи от използването на този превод.\n"
]
}
],
@ -1080,8 +1082,8 @@
"start_slideshow_at": "selected"
},
"coopTranslator": {
"original_hash": "914fc55f59efc7e17b8130d4033ac617",
"translation_date": "2025-08-30T00:10:07+00:00",
"original_hash": "d67e5b54ba20b507aa88d71aa3d042d8",
"translation_date": "2025-10-03T13:44:08+00:00",
"source_file": "lessons/3-NeuralNetworks/03-Perceptron/Perceptron.ipynb",
"language_code": "bg"
}

View File

@ -9,13 +9,13 @@
}
},
"source": [
"## পারসেপট্রন\n",
"## পারসেপট্রন\n",
"\n",
"> এই নোটবুকটি [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners)-এর একটি অংশ। সম্পূর্ণ শিক্ষাসামগ্রী পেতে রেপোজিটরিটি ভিজিট করুন।\n",
"> এই নোটবুকটি [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners)-এর একটি অংশ। সম্পূর্ণ শিক্ষামূলক উপকরণের জন্য রিপোজিটরি পরিদর্শন করুন।\n",
"\n",
"যেমনটি আমরা আলোচনা করেছি, পারসেপট্রন আপনাকে **বাইনারি ক্লাসিফিকেশন সমস্যা** সমাধান করতে সাহায্য করে, অর্থাৎ ইনপুট উদাহরণগুলোকে দুটি শ্রেণিতে শ্রেণীবদ্ধ করতে - আমরা এগুলোকে **পজিটিভ** এবং **নেগেটিভ** বলতে পারি।\n",
"যেমনটি আমরা আলোচনা করেছি, পারসেপট্রন আপনাকে **বাইনারি শ্রেণীবিন্যাস সমস্যা** সমাধান করতে সাহায্য করে, অর্থাৎ ইনপুট উদাহরণগুলোকে দুটি শ্রেণিতে শ্রেণীবিন্যাস করতে - আমরা এগুলোকে **পজিটিভ** এবং **নেগেটিভ** বলতে পারি।\n",
"\n",
"প্রথমে, চলুন কিছু প্রয়োজনীয় লাইব্রেরি ইমপোর্ট করি।\n"
"প্রথমে, চলুন কিছু প্রয়োজনীয় লাইব্রেরি ইমপোর্ট করি।\n"
]
},
{
@ -47,11 +47,11 @@
}
},
"source": [
"## টয় সমস্যা\n",
"## খেলনা সমস্যা\n",
"\n",
"শুরু করার জন্য, চলুন একটি টয় সমস্যার সাথে শুরু করি, যেখানে আমাদের দুটি ইনপুট ফিচার রয়েছে। উদাহরণস্বরূপ, চিকিৎসা ক্ষেত্রে আমরা টিউমারগুলোকে আকার এবং বয়সের উপর ভিত্তি করে বিনাইন এবং ম্যালিগন্যান্ট শ্রেণিবদ্ধ করতে চাই।\n",
"শুরুতে, চলুন একটি খেলনা সমস্যার সাথে শুরু করি, যেখানে আমাদের দুটি ইনপুট বৈশিষ্ট্য রয়েছে। উদাহরণস্বরূপ, চিকিৎসায় আমরা টিউমারগুলিকে সাইজ এবং বয়সের উপর ভিত্তি করে নিরাময়যোগ্য এবং ক্ষতিকারক শ্রেণিতে ভাগ করতে চাই।\n",
"\n",
"আমরা SciKit Learn লাইব্রেরির `make_classification` ফাংশন ব্যবহার করে একটি র্যান্ডম শ্রেণিবিন্যাস ডেটাসেট তৈরি করব:\n"
"আমরা SciKit Learn লাইব্রেরির `make_classification` ফাংশন ব্যবহার করে একটি র্যান্ডম শ্রেণিবিন্যাস ডেটাসেট তৈরি করব:\n"
]
},
{
@ -95,7 +95,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"চলুন dataset-টিও প্লট করি:\n"
"চলুন dataset টি প্লট করি:\n"
]
},
{
@ -154,11 +154,11 @@
"source": [
"## পারসেপট্রন\n",
"\n",
"যেহেতু পারসেপট্রন একটি বাইনারি শ্রেণীবিভাজক, প্রতিটি ইনপুট ভেক্টর $x$ এর জন্য আমাদের পারসেপট্রনের আউটপুট হবে +1 বা -1, যা শ্রেণির উপর নির্ভর করবে। আউটপুটটি নিচের সূত্র ব্যবহার করে গণনা করা হবে:\n",
"যেহেতু পারসেপট্রন একটি বাইনারি ক্লাসিফায়ার, প্রতিটি ইনপুট ভেক্টর $x$ এর জন্য আমাদের পারসেপট্রনের আউটপুট হবে +1 অথবা -1, যা ক্লাসের উপর নির্ভর করবে। আউটপুটটি নিম্নলিখিত সূত্র ব্যবহার করে গণনা করা হবে:\n",
"\n",
"$$y(\\mathbf{x}) = f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x})$$\n",
"\n",
"যেখানে $\\mathbf{w}$ একটি ওজন ভেক্টর, $f$ একটি স্টেপ অ্যাক্টিভেশন ফাংশন:\n",
"যেখানে $\\mathbf{w}$ একটি ওজন ভেক্টর এবং $f$ একটি স্টেপ অ্যাক্টিভেশন ফাংশন:\n",
"$$\n",
"f(x) = \\begin{cases}\n",
" +1 & x \\geq 0 \\\\\n",
@ -166,7 +166,7 @@
" \\end{cases} \\\\\n",
"$$\n",
"\n",
"তবে, একটি সাধারণ লিনিয়ার মডেলে একটি বায়াস (bias) থাকা উচিত, অর্থাৎ আদর্শভাবে আমাদের $y$ গণনা করা উচিত $y=f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}+\\mathbf{b})$ হিসেবে। আমাদের মডেলটি সহজ করার জন্য, আমরা এই বায়াস টার্মটি বাদ দিতে পারি যদি আমরা আমাদের ইনপুট ফিচারে একটি অতিরিক্ত মাত্রা যোগ করি, যা সর্বদা 1 এর সমান:\n"
"তবে, একটি সাধারণ লিনিয়ার মডেলে একটি বায়াস থাকা উচিত, অর্থাৎ আদর্শভাবে আমাদের $y$ গণনা করা উচিত $y=f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}+\\mathbf{b})$ হিসাবে। আমাদের মডেলটি সহজ করার জন্য, আমরা ইনপুট বৈশিষ্ট্যগুলিতে একটি অতিরিক্ত মাত্রা যোগ করে এই বায়াস টার্মটি বাদ দিতে পারি, যা সর্বদা 1 এর সমান:\n"
]
},
{
@ -206,20 +206,20 @@
"source": [
"## প্রশিক্ষণ অ্যালগরিদম\n",
"\n",
"পার্সেপট্রন প্রশিক্ষণ করার জন্য, আমাদের এমন ওজন $\\mathbf{w}$ খুঁজে বের করতে হবে যা ত্রুটি কমাবে। ত্রুটি **পার্সেপট্রন ক্রাইটেরিয়া** ব্যবহার করে সংজ্ঞায়িত করা হয়:\n",
"পার্সেপট্রন প্রশিক্ষণ করার জন্য, আমাদের এমন ওজন $\\mathbf{w}$ খুঁজে বের করতে হবে যা ত্রুটি কমাবে। ত্রুটি **পার্সেপট্রন ক্রাইটেরিয়া** ব্যবহার করে সংজ্ঞায়িত করা হয়:\n",
"\n",
"$$E(\\mathbf{w}) = -\\sum_{n \\in \\mathcal{M}}\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}_{n}t_{n}$$\n",
" \n",
" * $t_{n} \\in \\{-1, +1\\}$ নেতিবাচক এবং ইতিবাচক প্রশিক্ষণ নমুনার জন্য যথাক্রমে\n",
" * $\\mathcal{M}$ - ভুলভাবে শ্রেণীবদ্ধ উদাহরণগুলোর একটি সেট\n",
" * $\\mathcal{M}$ - ভুলভাবে শ্রেণীবদ্ধ উদাহরণগুলোর সেট\n",
" \n",
"আমরা **গ্রেডিয়েন্ট ডিসেন্ট** প্রক্রিয়া ব্যবহার করব। কিছু প্রাথমিক র্যান্ডম ওজন $\\mathbf{w}^{(0)}$ দিয়ে শুরু করে, আমরা প্রশিক্ষণের প্রতিটি ধাপে ত্রুটির গ্রেডিয়েন্ট ব্যবহার করে ওজন সামঞ্জস্য করব:\n",
"আমরা **গ্রেডিয়েন্ট ডিসেন্ট** প্রক্রিয়া ব্যবহার করব। প্রাথমিকভাবে কিছু র্যান্ডম ওজন $\\mathbf{w}^{(0)}$ দিয়ে শুরু করে, আমরা প্রতিটি প্রশিক্ষণ ধাপে $E$-এর গ্রেডিয়েন্ট ব্যবহার করে ওজন সমন্বয় করব:\n",
"\n",
"$$\\mathbf{w}^{\\tau + 1}=\\mathbf{w}^{\\tau} - \\eta \\nabla E(\\mathbf{w}) = \\mathbf{w}^{\\tau} + \\eta\\sum_{n \\in \\mathcal{M}}\\mathbf{x}_{n} t_{n}$$\n",
"\n",
"যেখানে $\\eta$ হল **লার্নিং রেট**, এবং $\\tau\\in\\mathbb{N}$ - ইটারেশনের সংখ্যা।\n",
"যেখানে $\\eta$ হল **লার্নিং রেট**, এবং $\\tau\\in\\mathbb{N}$ - ইটারেশনের সংখ্যা।\n",
"\n",
"চলুন এই অ্যালগরিদমটি পাইথনে সংজ্ঞায়িত করি:\n"
"চলুন এই অ্যালগরিদমটি পাইথনে সংজ্ঞািত করি:\n"
]
},
{
@ -311,9 +311,9 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"যেমনটি দেখা যাচ্ছে, প্রাথমিক সঠিকতার হার প্রায় ৫০%, তবে এটি দ্রুত বৃদ্ধি পেয়ে ৯০%-এর কাছাকাছি উচ্চ মানে পৌঁছে যায়।\n",
"যেমনটি আপনি দেখতে পাচ্ছেন, প্রাথমিক সঠিকতা প্রায় ৫০% এর কাছাকাছি, তবে এটি দ্রুত বৃদ্ধি পেয়ে ৯০% এর কাছাকাছি উচ্চ মানে পৌঁছায়।\n",
"\n",
"এখন চলুন দেখি কীভাবে শ্রেণিগুলি পৃথক হয়। আমাদের শ্রেণীবিন্যাস ফাংশন $\\mathbf{w}^Tx$ এর মতো দেখায়, এবং এটি একটি শ্রেণির জন্য -এর বেশি এবং অন্যটির জন্য -এর নিচে থাকে। সুতরাং, শ্রেণি বিভাজন রেখাটি $\\mathbf{w}^Tx = 0$ দ্বারা সংজ্ঞায়িত হয়। যেহেতু আমাদের মাত্র দুটি মাত্রা $x_0$ এবং $x_1$ রয়েছে, রেখার সমীকরণটি হবে $w_0x_0+w_1x_1+w_2 = 0$ (মনে রাখবেন যে আমরা স্পষ্টভাবে একটি অতিরিক্ত মাত্রা $x_2=1$ সংজ্ঞায়িত করেছি)। এখন চলুন এই রেখাটি অঙ্কন করি:\n"
"চলুন দেখি কীভাবে শ্রেণিগুলি আলাদা করা হয়েছে। আমাদের শ্রেণিবিন্যাস ফাংশন $\\mathbf{w}^Tx$ এর মতো দেখায়, এবং এটি একটি শ্রেণির জন্য এর বেশি এবং অন্যটির জন্য এর নিচে থাকে। সুতরাং, শ্রেণি বিভাজন রেখা $\\mathbf{w}^Tx = 0$ দ্বারা সংজ্ঞায়িত হয়। যেহেতু আমাদের মাত্র দুটি মাত্রা $x_0$ এবং $x_1$ রয়েছে, রেখার সমীকরণ হবে $w_0x_0+w_1x_1+w_2 = 0$ (মনে রাখুন আমরা স্পষ্টভাবে একটি অতিরিক্ত মাত্রা $x_2=1$ সংজ্ঞায়িত করেছি)। চলুন এই রেখাটি প্লট করি:\n"
]
},
{
@ -379,9 +379,9 @@
}
},
"source": [
"## টেস্ট ডেটাসেটে মূল্যায়ন করুন\n",
"## টেস্ট ডেটাসেটে মূল্যায়ন\n",
"\n",
"শুরুতে, আমরা কিছু ডেটা টেস্ট ডেটাসেটের জন্য আলাদা করে রেখেছি। চলুন দেখি আমাদের ক্লাসিফায়ার এই টেস্ট ডেটাসেটে কতটা সঠিক। এটি করার জন্য, আমরা টেস্ট ডেটাসেটকে একটি অতিরিক্ত ডাইমেনশনে প্রসারিত করি, ওজন ম্যাট্রিক্সের সাথে গুণ করি, এবং নিশ্চিত করি যে প্রাপ্ত মান লেবেলের (+1 বা -1) মতো একই চিহ্নের। এরপর আমরা সমস্ত বুলিয়ান মান একত্রিত করি এবং টেস্ট স্যাম্পলের দৈর্ঘ্য দিয়ে ভাগ করি, যাতে সঠিকতার মান পাওয়া যায়:\n"
"শুরুতে, আমরা কিছু ডেটা টেস্ট ডেটাসেটের জন্য আলাদা করে রেখেছি। চলুন দেখি আমাদের ক্লাসিফায়ার এই টেস্ট ডেটাসেটে কতটা সঠিক। এটি করার জন্য, আমরা টেস্ট ডেটাসেটকে একটি অতিরিক্ত মাত্রা দিয়ে প্রসারিত করি, ওজন ম্যাট্রিক্স দ্বারা গুণ করি, এবং নিশ্চিত করি যে প্রাপ্ত মানটি লেবেলের (যেমন +1 বা -1) মতো একই চিহ্নের। এরপর আমরা সমস্ত বুলিয়ান মান যোগ করি এবং টেস্ট স্যাম্পলের দৈর্ঘ্য দিয়ে ভাগ করি, যাতে সঠিকতার মান পাওয়া যায়:\n"
]
},
{
@ -422,7 +422,7 @@
"source": [
"## প্রশিক্ষণ প্রক্রিয়া পর্যবেক্ষণ করা\n",
"\n",
"আমরা আগেও দেখেছি কীভাবে প্রশিক্ষণের সময় সঠিকতার হার কমে যায়। প্রশিক্ষণের সময় বিভাজন রেখাটি কীভাবে আচরণ করে তা দেখা ভালো হবে। নিচের কোডটি সবকিছু এক গ্রাফে চিত্রিত করবে, এবং আপনি স্লাইডারটি সরিয়ে প্রশিক্ষণ প্রক্রিয়ার মধ্য দিয়ে \"সময়ের ভ্রমণ\" করতে পারবেন।\n"
"আমরা আগেও দেখেছি কীভাবে প্রশিক্ষণের সময় সঠিকতার হার কমে যায়। প্রশিক্ষণের সময় বিভাজন রেখাটি কীভাবে পরিবর্তিত হয় তা দেখাও বেশ আকর্ষণীয় হবে। নিচের কোডটি একটি গ্রাফে সবকিছু প্রদর্শন করবে, এবং আপনি স্লাইডারটি সরিয়ে প্রশিক্ষণ প্রক্রিয়ার মধ্য দিয়ে \"সময়ের ভ্রমণ\" করতে পারবেন।\n"
]
},
{
@ -527,18 +527,18 @@
}
},
"source": [
"## পারসেপট্রনের সীমাবদ্ধতা\n",
"## পারসেপট্রনের সীমাবদ্ধতা\n",
"\n",
"উপরে যেমন দেখা গেছে, পারসেপট্রন একটি **লিনিয়ার ক্লাসিফায়ার**। এটি দুটি শ্রেণিকে ভালোভাবে আলাদা করতে পারে যদি তারা **লিনিয়ারলি সেপারেবল** হয়, অর্থাৎ একটি সরল রেখা দিয়ে আলাদা করা যায়। অন্যথায়, পারসেপট্রনের প্রশিক্ষণ প্রক্রিয়া সঠিকভাবে সম্পন্ন হবে না।\n",
"যেমন আপনি উপরে দেখেছে, পারসেপট্রন একটি **লিনিয়ার ক্লাসিফায়ার**। এটি দুইটি শ্রেণির মধ্যে পার্থক্য করতে পারে যদি তারা **লিনিয়ারলি সেপারেবল** হয়, অর্থাৎ একটি সরল রেখা দ্বারা পৃথক করা যায়। অন্যথায়, পারসেপট্রনের প্রশিক্ষণ প্রক্রিয়া সঠিকভাবে সম্পন্ন হবে না।\n",
"\n",
"পারসেপট্রন দিয়ে সমাধান করা যায় না এমন একটি সমস্যার সবচেয়ে সুস্পষ্ট উদাহরণ হল তথাকথিত **XOR সমস্যা**। আমরা চাই আমাদের পারসেপট্রন XOR বুলিয়ান ফাংশনটি শিখুক, যার সত্যতার টেবিল নিম্নরূপ:\n",
"পার্সেপট্রন দ্বারা সমাধান করা যায় না এমন একটি সমস্যার সবচেয়ে স্পষ্ট উদাহরণ হলো **XOR সমস্যা**। আমরা চাই আমাদের পারসেপট্রন XOR বুলিয়ান ফাংশনটি শিখুক, যার সত্য টেবিল নিম্নরূপ:\n",
"\n",
"| | 0 | 1 |\n",
"|---|---|---|\n",
"| 0 | 0 | 1 | \n",
"| 1 | 1 | 0 |\n",
"\n",
"চলুন এটি চেষ্টা করে দেখি! আমরা ম্যানুয়ালি সব পজিটিভ এবং নেগেটিভ প্রশিক্ষণ নমুনা পূরণ করব, তারপর উপরে সংজ্ঞায়িত আমাদের train ফাংশনটি কল করব:\n"
"চলুন চেষ্টা করি! আমরা ম্যানুয়ালি সব পজিটিভ এবং নেগেটিভ প্রশিক্ষণ নমুনা পূরণ করব, তারপর উপরে সংজ্ঞায়িত আমাদের train ফাংশনটি কল করব:\n"
]
},
{
@ -605,19 +605,19 @@
}
},
"source": [
"যেমনটি উপরের গ্রাফ থেকে দেখা যাচ্ছে, সঠিকতার হার কখনোই ৭৫% এর উপরে যায় না, কারণ এমন একটি সরল রেখা আঁকা অসম্ভব যা দিয়ে সব উদাহরণ সঠিকভাবে আলাদা করা যায়।\n",
"যেমনটি আপনি উপরের গ্রাফ থেকে দেখতে পাচ্ছেন, সঠিকতার হার কখনোই ৭৫% এর উপরে যায় না, কারণ এমন একটি সরল রেখা আঁকা অসম্ভব যা সমস্ত উদাহরণকে সঠিকভাবে আলাদা করতে পারে।\n",
"\n",
"XOR সমস্যা হলো পারসেপট্রনের সীমাবদ্ধতার একটি ক্লাসিক উদাহরণ, এবং এটি ১৯৬৯ সালে মারভিন মিনস্কি এবং সেমুর প্যাপার্ট তাদের বই [Perceptrons](https://en.wikipedia.org/wiki/Perceptrons_(book))-এ উল্লেখ করেছিলেন। এই পর্যবেক্ষণ প্রায় ১০ বছর ধরে নিউরাল নেটওয়ার্ক গবেষণাকে সীমিত করে রেখেছিল, যদিও - এবং আমরা আমাদের কোর্সের পরবর্তী অংশে এটি দেখব - বহুস্তর বিশিষ্ট পারসেপট্রন এমন সমস্যাগুলি সমাধান করতে পুরোপুরি সক্ষম।\n",
"XOR সমস্যা হলো পারসেপট্রনের সীমাবদ্ধতার একটি ক্লাসিক উদাহরণ, এবং এটি ১৯৬৯ সালে মারভিন মিনস্কি এবং সেমুর প্যাপার্ট তাদের বই [Perceptrons](https://en.wikipedia.org/wiki/Perceptrons_(book))-এ উল্লেখ করেছিলেন। এই পর্যবেক্ষণ প্রায় ১০ বছর ধরে নিউরাল নেটওয়ার্ক গবেষণাকে সীমিত করেছিল, যদিও - এবং আমরা আমাদের কোর্সের পরবর্তী অংশে এটি দেখব - বহু-স্তরযুক্ত পারসেপট্রন এমন সমস্যাগুলি সমাধান করতে পুরোপুরি সক্ষম।\n",
"\n",
"## জটিল উদাহরণ - MNIST\n",
"\n",
"যদিও পারসেপট্রন XOR সমস্যাটি সমাধান করতে পারে না, এটি আরও অনেক জটিল সমস্যা সমাধান করতে পারে, যেমন হাতে লেখা অক্ষর নাক্তকরণ।\n",
"যদিও পারসেপট্রন XOR সমস্যাটি সমাধান করতে পারে না, এটি আরও অনেক জটিল সমস্যা সমাধান করতে পারে, যেমন হাতে লেখা অক্ষর নাক্তকরণ।\n",
"\n",
"যে ডেটাসেটটি মেশিন লার্নিং শিখতে প্রায়ই ব্যবহৃত হয়, সেটি [MNIST](https://en.wikipedia.org/wiki/MNIST_database) নামে পরিচিত। এটি মডিফাইড ন্যাশনাল ইনস্টিটিউট অফ স্ট্যান্ডার্ডস অ্যান্ড টেকনোলজি দ্বারা তৈরি করা হয়েছে এবং এতে ৬০, হাতে লেখা সংখ্যার একটি প্রশিক্ষণ সেট রয়েছে, যা প্রায় ২৫০ জন ছাত্র এবং ইনস্টিটিউটের কর্মচারীদের কাছ থেকে সংগ্রহ করা হয়েছে। এছাড়াও, ১০, সংখ্যার একটি টেস্ট ডেটাসেট রয়েছে, যা বিভিন্ন ব্যক্তির কাছ থেকে সংগ্রহ করা হয়েছে।\n",
"যে ডেটাসেটটি মেশিন লার্নিং শিখতে প্রায়ই ব্যবহৃত হয় সেটি [MNIST](https://en.wikipedia.org/wiki/MNIST_database) নামে পরিচিত। এটি Modified National Institute of Standards and Technology দ্বারা তৈরি করা হয়েছে এবং এতে ৬০, হাতে লেখা সংখ্যার একটি প্রশিক্ষণ সেট রয়েছে, যা প্রায় ২৫০ জন ছাত্র এবং ইনস্টিটিউটের কর্মচারীদের কাছ থেকে সংগ্রহ করা হয়েছে। এছাড়াও, ১০, সংখ্যার একটি টেস্ট ডেটাসেট রয়েছে, যা বিভিন্ন ব্যক্তির কাছ থেকে সংগ্রহ করা হয়েছে।\n",
"\n",
"সব সংখ্যাগুলি ২৮x২৮ পিক্সেলের গ্রেস্কেল ইমেজ আকারে উপস্থাপিত।\n",
"সব সংখ্যাগুলি ২৮x২৮ পিক্সেলের গ্রেস্কেল ইমেজ হিসেবে উপস্থাপিত।\n",
"\n",
"> MNIST ডেটাসেট [Kaggle](https://www.kaggle.com/c/digit-recognizer)-এ একটি প্রশিক্ষণ প্রতিযোগিতা হিসেবে উপলব্ধ, যা মেশিন লার্নিং প্রতিযোগিতা এবং কনটেস্ট হোস্ট করে। একবার আপনি MNIST সংখ্যাগুলি শ্রেণীবদ্ধ করতে শিখে গেলে, আপনি আপনার সমাধান Kaggle-এ জমা দিতে পারেন এবং অন্যান্য অংশগ্রহণকারীদের মধ্যে এটি কীভাবে রেট করা হয় তা দেখতে পারেন।\n",
"> MNIST ডেটাসেট [Kaggle](https://www.kaggle.com/c/digit-recognizer)-এ একটি প্রশিক্ষণ প্রতিযোগিতা হিসেবে উপলব্ধ, যা মেশিন লার্নিং প্রতিযোগিতা এবং কনটেস্ট আয়োজন করে। একবার আপনি MNIST সংখ্যাগুলি শ্রেণীবদ্ধ করতে শিখলে, আপনি আপনার সমাধান Kaggle-এ জমা দিতে পারেন এবং দেখতে পারেন এটি অন্যান্য অংশগ্রহণকারীদের মধ্যে কীভাবে মূল্যায়িত হয়।\n",
"\n",
"আমরা MNIST ডেটাসেট লোড করা দিয়ে শুরু করি:\n"
]
@ -695,7 +695,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"কারণ পারসেপট্রন একটি বাইনারি শ্রেণীবিভাজক, আমরা আমাদের সমস্যাকে কেবল দুটি সংখ্যা সনাক্ত করার মধ্যে সীমাবদ্ধ রাখব। নিচের ফাংশনটি দুটি প্রদত্ত সংখ্যার জন্য পজিটিভ এবং নেগেটিভ নমুনার অ্যারে পূরণ করবে (এবং স্পষ্টতার জন্য সেই সংখ্যাগুলোর নমুনাও দেখাবে)।\n"
"কারণ পারসেপট্রন একটি বাইনারি শ্রেণীবিন্যাসকারী, আমরা আমাদের সমস্যাকে কেবল দুটি সংখ্যা সনাক্ত করার মধ্যে সীমাবদ্ধ রাখব। নিচের ফাংশনটি দুটি প্রদত্ত সংখ্যার জন্য পজিটিভ এবং নেগেটিভ নমুনার অ্যারে পূরণ করবে (এবং স্পষ্টতার জন্য সেই সংখ্যাগুলির নমুনাগুলিও দেখাবে)।\n"
]
},
{
@ -831,13 +831,13 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"অনুগ্রহ করে লক্ষ্য করুন যে কীভাবে নির্ভুলতা খুব দ্রুত প্রায় ১০০% পর্যন্ত পৌঁছে যায়।\n",
"দয়া করে লক্ষ্য করুন যে নির্ভুলতা খুব দ্রুত প্রায় ১০০% এ পৌঁছে যায়।\n",
"\n",
"অনুগ্রহ করে স্লাইডারটি প্রশিক্ষণের শেষের দিকে কোনো অবস্থানে সরান এবং বাম দিকে প্রদর্শিত ওজন ম্যাট্রিক্সটি পর্যবেক্ষণ করুন। এই ম্যাট্রিক্সটি আপনাকে বুঝতে সাহায্য করবে যে পারসেপট্রন কীভাবে কাজ করে। আপনি ক্ষেত্রের মাঝখানে উচ্চ ওজন মান দেখতে পাবেন, যা সাধারণত সংখ্যা ১-এর জন্য উপস্থিত পিক্সেলগুলোর সাথে মিলে যা, এবং পাশের দিকে নিম্ন নেতিবাচক মান, যেখানে সংখ্যা -এর অংশ থাকে। সুতরাং, যদি পারসেপট্রনের কাছে প্রদর্শিত সংখ্যা প্রকৃতপক্ষে ১ হয়, তবে এর মাঝের অংশটি উচ্চ মান দ্বারা গুণিত হবে এবং একটি ধনাত্মক ফলাফল তৈরি করবে। বিপরীতে, যখন পারসেপট্রন পর্যবেক্ষণ করে, সংশ্লিষ্ট পিক্সেলগুলো নেতিবাচক সংখ্যার সাথে গুণিত হবে।\n",
"অনুগ্রহ করে, ট্রেনিংয়ের শেষের দিকে স্লাইডারটি সরান এবং বাম দিকে প্রদর্শিত ওজন ম্যাট্রিক্সটি পর্যবেক্ষণ করুন। এই ম্যাট্রিক্সটি আপনাকে বুঝতে সাহায্য করবে যে পারসেপট্রন কীভাবে কাজ করে। আপনি ক্ষেত্রের মাঝখানে উচ্চ ওজন মান দেখতে পাবেন, যা সাধারণত ডিজিট ১-এর জন্য উপস্থিত পিক্সেলগুলোর সাথে মিলে যায়, এবং পাশের দিকে নিম্ন নেতিবাচক মান, যেখানে ডিজিটের অংশ থাকে। সুতরাং, যদি পারসেপট্রনের কাছে প্রদত্ত ডিজিটটি আসলে ১ হয়, তবে এর মাঝের অংশটি উচ্চ মান দ্বারা গুণিত হবে, যা একটি ইতিবাচক ফলাফল তৈরি করবে। বিপরীতে, যখন পারসেপট্রন পর্যবেক্ষণ করে, সংশ্লিষ্ট পিক্সেলগুলো নেতিবাচক সংখ্যার সাথে গুণিত হবে।\n",
"\n",
"> আপনি লক্ষ্য করতে পারেন যে যদি আমরা আমাদের পারসেপট্রনকে সামান্য অনুভূমিকভাবে সরানো একটি সংখ্যা ১ দিই, যাতে এর পিক্সেলগুলো এমন স্থানে থাকে যেখানে -এর উল্লম্ব অংশ থাকে, তাহলে আমরা ভুল ফলাফল পেতে পারি। যেহেতু আমাদের MNIST ডেটাসেটের প্রকৃতি এমন যে সমস্ত সংখ্যাগুলো কেন্দ্রীভূত এবং সঠিকভাবে অবস্থান করা থাকে, এবং পারসেপট্রন এই বৈশিষ্ট্যের উপর নির্ভর করে সংখ্যাগুলো আলাদা করতে।\n",
"> আপনি লক্ষ্য করতে পারেন যে যদি আমরা আমাদের পারসেপট্রনকে একটি ডিজিট ১ দিই যা সামান্য অনুভূমিকভাবে সরানো হয়েছে, যাতে এর পিক্সেলগুলো এমন জায়গা দখল করে যেখানে -এর উল্লম্ব অংশ রয়েছে, তাহলে আমরা ভুল ফলাফল পেতে পারি। কারণ আমাদের MNIST ডেটাসেটের প্রকৃতি এমন যে সমস্ত ডিজিট কেন্দ্রীভূত এবং সঠিকভাবে অবস্থান করা থাকে, এবং পারসেপট্রন এটি ব্যবহার করেই ডিজিটগুলোকে আলাদা করে।\n",
"\n",
"এখন চলুন বিভিন্ন সংখ্যা চেষ্টা করি:\n"
"এখন চলুন বিভিন্ন ডিজিট চেষ্টা করি: \n"
]
},
{
@ -913,11 +913,11 @@
"source": [
"## আলোচনা\n",
"\n",
"কোনো এক কারণে, ২ এবং ৫ সহজে আলাদা করা যায় না। যদিও আমরা তুলনামূলকভাবে উচ্চ নির্ভুলতা (৮৫% এর উপরে) পাই, তবুও স্পষ্টভাবে দেখা যায় যে, কিছু পর্যায়ে গিয়ে পারসেপট্রন শেখা বন্ধ করে দেয়।\n",
"কোনো কারণে, ২ এবং ৫ সংখ্যাগুলো সহজে আলাদা করা যায় না। যদিও আমরা তুলনামূলকভাবে উচ্চ সঠিকতা (৮৫% এর উপরে) পাই, তবুও স্পষ্টভাবে দেখা যায় যে, perceptron এি পর্যায়ে গিয়ে শেখা বন্ধ করে দেয়।\n",
"\n",
"এটি কেন ঘটে তা বুঝতে, আমরা [Principal Component Analysis](https://en.wikipedia.org/wiki/Principal_component_analysis) (PCA) ব্যবহার করতে পারি। এটি একটি মেশিন লার্নিং কৌশল যা ইনপুট ডেটাসেটের মাত্রা কমানোর জন্য ব্যবহৃত হয়, যাতে শ্রেণিগুলোর মধ্যে সর্বোত্তম আলাদা করার ক্ষমতা পাওয়া যায়।\n",
"এটি কেন ঘটে তা বুঝতে, আমরা [Principal Component Analysis](https://en.wikipedia.org/wiki/Principal_component_analysis) (PCA) ব্যবহার করতে পারি। এটি একটি মেশিন লার্নিং পদ্ধতি যা ইনপুট ডেটাসেটের মাত্রা কমানোর জন্য ব্যবহৃত হয়, যাতে শ্রেণিগুলোর মধ্যে সর্বোত্তম পৃথকীকরণ পাওয়া যায়।\n",
"\n",
"আমাদের ক্ষেত্রে, একটি ইনপুট ইমেজে ৭৮৪ পিক্সেল (ইনপুট ফিচার) থাকে, এবং আমরা PCA ব্যবহার করে প্যারামিটারের সংখ্যা মাত্র ২-এ কমাতে চাই, যাতে আমরা সেগুলো গ্রাফে প্লট করতে পারি। এই দু প্যারামিটার মূল ফিচারগুলোর একটি লিনিয়ার কম্বিনেশন হবে, এবং আমরা এই প্রক্রিয়াকে আমাদের মূল ৭৮৪-ডাইমেনশনাল স্পেসকে \"ঘোরানো\" এবং তার প্রক্ষেপণকে ২D-স্পেসে পর্যবেক্ষণ করার মতো দেখতে পারি, যতক্ষণ না আমরা শ্রেণিগুলোর মধ্যে সর্বোত্তম আলাদা করার দৃশ্য পাই।\n"
"আমাদের ক্ষেত্রে, একটি ইনপুট ইমেজে ৭৮৪টি পিক্সেল (ইনপুট ফিচার) থাকে, এবং আমরা PCA ব্যবহার করে প্যারামিটারের সংখ্যা মাত্র ২-এ কমাতে চাই, যাতে আমরা সেগুলো গ্রাফে প্লট করতে পারি। এই দুটি প্যারামিটার মূল ফিচারগুলোর একটি লিনিয়ার কম্বিনেশন হবে, এবং আমরা এই প্রক্রিয়াকে আমাদের মূল ৭৮৪-মাত্রিক স্পেসকে \"ঘোরানো\" এবং তার প্রক্ষেপণকে ২D-স্পেসে পর্যবেক্ষণ করা হিসেবে দেখতে পারি, যতক্ষণ না আমরা শ্রেণিগুলোর মধ্যে সর্বোত্তম পৃথকীকরণ দেখতে পাই।\n"
]
},
{
@ -1027,33 +1027,33 @@
}
},
"source": [
"যেমনটি দেখা যাচ্ছে, 0 এবং 1 একটি সরল রেখা দ্বারা স্পষ্টভাবে পৃথক করা যায়। এটি নির্দেশ করে যে মূল ৭৮৪-মাত্রিক স্থানে সংখ্যাগুলোর সাথে সম্পর্কিত বিন্দুগুলোও সরলরেখায় পৃথকযোগ্য। তবে ২ এবং ৫ এর ক্ষেত্রে, এমন একটি ভালো প্রক্ষেপণ খুঁজে পাওয়া যায় না যা সংখ্যাগুলোকে স্পষ্টভাবে পৃথক করবে, এবং এর ফলে কিছু ভুল শ্রেণবিন্যাস ঘটে।\n",
"যেমনটি দেখা যাচ্ছে, 0 এবং 1 একটি সরল রেখা দ্বারা স্পষ্টভাবে পৃথক করা যেতে পারে। এটি নির্দেশ করে যে মূল 784-ডাইমেনশনাল স্পেসে সংখ্যাগুলোর সাথে সম্পর্কিত বিন্দুগুলোও সরলরেখাভাবে পৃথকযোগ্য। কিন্তু 2 এবং 5 এর ক্ষেত্রে, এমন একটি ভালো প্রক্ষেপণ খুঁজে পাওয়া যায় না যা সংখ্যাগুলোকে স্পষ্টভাবে পৃথক করবে, এবং এর ফলে কিছু ভুল শ্রেণিবিন্যাস ঘটে।\n",
"\n",
"> এই কোর্সে আমরা পরে শিখব কীভাবে নিউরাল নেটওয়ার্ক ব্যবহার করে অ-রৈখিক শ্রেণীবিন্যাসকারী তৈরি করা যায় এবং কীভাবে সংখ্যাগুলো সঠিকভাবে সারিবদ্ধ না থাকার সমস্যার সমাধান করা যায়। খুব শীঘ্রই আমরা MNIST সংখ্যাগুলোর শ্রেণীবিন্যাসে ৯৯% এর উপরে সঠিকতা অর্জন করব, যেখানে এগুলোকে ১০টি ভিন্ন শ্রেণীতে শ্রেণীবদ্ধ করা হবে।\n",
"> এই কোর্সে আমরা পরে শিখব কীভাবে Neural Networks ব্যবহার করে অ-রৈখিক শ্রেণিবিন্যাসকারী তৈরি করা যায় এবং কীভাবে সংখ্যাগুলো সঠিকভাবে সাজানো না থাকলে সেই সমস্যার সমাধান করা যায়। খুব শীঘ্রই আমরা MNIST সংখ্যাগুলোর শ্রেণিবিন্যাসে 99% এর উপরে সঠিকতা অর্জন করব, যেখানে 10টি ভিন্ন শ্রেণিতে তাদের শ্রেণিবদ্ধ করা হবে।\n",
"\n",
"## মূল বিষয়বস্তু\n",
"## মূল বিষয়\n",
"\n",
" * আমরা সবচেয়ে সহজ নিউরাল নেটওয়ার্ক আর্কিটেকচার - এক-স্তরের পারসেপট্রন সম্পর্কে শিখেছি।\n",
" * আমরা পারসেপট্রন \"নিজে হাতে\" বাস্তবায়ন করেছি, যেখানে সাধারণ গ্রেডিয়েন্ট ডিজেন্ট ভিত্তিক প্রশিক্ষণ পদ্ধতি ব্যবহার করা হয়েছে।\n",
" * সরলতার পরেও, এক-স্তরের পারসেপট্রন হাতে লেখা সংখ্যাগুলোর স্বীকৃতির মতো জটিল সমস্যাগুলো সমাধান করতে পারে।\n",
" * এক-স্তরের পারসেপট্রন একটি রৈখিক শ্রেণীবিন্যাসকারী, এবং তাই এটি লজিস্টিক রিগ্রেশনের মতো একই শ্রেণীবিন্যাস ক্ষমতা প্রদান করে।\n",
" * নমুনা স্থানে, পারসেপট্রন একটি হাইপারপ্লেন ব্যবহার করে ইনপুট ডেটার দুটি শ্রেণীকে পৃথক করতে পারে।\n"
" * আমরা সবচেয়ে সহজ Neural Network আর্কিটেকচার - এক-স্তর বিশিষ্ট perceptron সম্পর্কে শিখেছি।\n",
" * আমরা perceptron \"নিজ হাতে\" বাস্তবায়ন করেছি, যেখানে gradient descent ভিত্তিক একটি সহজ প্রশিক্ষণ পদ্ধতি ব্যবহার করা হয়েছে।\n",
" * সরলতার পরেও, এক-স্তর বিশিষ্ট perceptron হাতে লেখা সংখ্যাগুলোর জটিল সমস্যাগুলো সমাধান করতে পারে।\n",
" * এক-স্তর বিশিষ্ট perceptron একটি রৈখিক শ্রেণিবিন্যাসকারী, এবং এটি logistic regression এর সমান শ্রেণিবিন্যাস ক্ষমতা প্রদান করে।\n",
" * নমুনা স্পেসে, perceptron একটি hyperplane ব্যবহার করে ইনপুট ডেটার দুটি শ্রেণি পৃথক করতে পারে।\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## ক্রেডিট\n",
"## ক্রেডিট\n",
"\n",
"এই নোটবুকটি [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners)-এর একটি অংশ এবং এটি [Dmitry Soshnikov](http://soshnikov.com) দ্বারা প্রস্তুত করা হয়েছে। এটি Microsoft Research Cambridge-এ Neural Network Workshop দ্বারা অনুপ্রাণিত। কিছু কোড এবং চিত্রণমূলক উপকরণ [Katja Hoffmann](https://www.microsoft.com/en-us/research/people/kahofman/), [Matthew Johnson](https://www.microsoft.com/en-us/research/people/matjoh/) এবং [Ryoto Tomioka](https://www.microsoft.com/en-us/research/people/ryoto/) এর উপস্থাপনা থেকে নেওয়া হয়েছে, এবং [NeuroWorkshop](http://github.com/shwars/NeuroWorkshop) রিপোজিটরি থেকেও সংগ্রহ করা হয়েছে।\n"
"এই নোটবুকটি [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners)-এর একটি অংশ, এবং এটি [Dmitry Soshnikov](http://soshnikov.com) দ্বারা প্রস্তুত করা হয়েছে। এটি Microsoft Research Cambridge-এ Neural Network Workshop দ্বারা অনুপ্রাণিত। কিছু কোড এবং চিত্রিত উপকরণ [Katja Hoffmann](https://www.microsoft.com/en-us/research/people/kahofman/), [Matthew Johnson](https://www.microsoft.com/en-us/research/people/matjoh/) এবং [Ryoto Tomioka](https://www.microsoft.com/en-us/research/people/ryoto/) এর উপস্থাপনা থেকে নেওয়া হয়েছে, এবং [NeuroWorkshop](http://github.com/shwars/NeuroWorkshop) রিপোজিটরি থেকে।\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**অস্বীকৃতি**: \nএই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসাধ্য সঠিক অনুবাদের চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। নথিটির মূল ভাষায় লেখা সংস্করণটিকেই প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে সৃষ্ট কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যার জন্য আমরা দায়ী নই।\n"
"\n---\n\n**অস্বীকৃতি**: \nএই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসাধ্য সঠিকতার জন্য চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা দায়বদ্ধ থাকব না।\n"
]
}
],
@ -1082,8 +1082,8 @@
"start_slideshow_at": "selected"
},
"coopTranslator": {
"original_hash": "914fc55f59efc7e17b8130d4033ac617",
"translation_date": "2025-08-29T06:58:01+00:00",
"original_hash": "d67e5b54ba20b507aa88d71aa3d042d8",
"translation_date": "2025-10-03T13:17:58+00:00",
"source_file": "lessons/3-NeuralNetworks/03-Perceptron/Perceptron.ipynb",
"language_code": "bn"
}

View File

@ -11,9 +11,9 @@
"source": [
"## Perceptron\n",
"\n",
"> Este notebook faz parte do [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners). Visite o repositório para acessar o conjunto completo de materiais de aprendizado.\n",
"> Este notebook faz parte do [Currículo de IA para Iniciantes](http://github.com/microsoft/ai-for-beginners). Visite o repositório para acessar o conjunto completo de materiais de aprendizado.\n",
"\n",
"Como discutimos, o perceptron permite resolver um **problema de classificação binária**, ou seja, classificar exemplos de entrada em duas classes - podemos chamá-las de **positiva** e **negativa**.\n",
"Como discutimos, o perceptron permite resolver o **problema de classificação binária**, ou seja, classificar exemplos de entrada em duas classes - podemos chamá-las de **positiva** e **negativa**.\n",
"\n",
"Primeiro, vamos importar algumas bibliotecas necessárias.\n"
]
@ -166,7 +166,7 @@
" \\end{cases} \\\\\n",
"$$\n",
"\n",
"No entanto, um modelo linear genérico também deve ter um viés (bias), ou seja, idealmente deveríamos calcular $y$ como $y=f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}+\\mathbf{b})$. Para simplificar nosso modelo, podemos eliminar esse termo de viés adicionando mais uma dimensão às nossas características de entrada, que sempre será igual a 1:\n"
"No entanto, um modelo linear genérico também deve ter um termo de viés, ou seja, idealmente deveríamos calcular $y$ como $y=f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}+\\mathbf{b})$. Para simplificar nosso modelo, podemos eliminar esse termo de viés adicionando mais uma dimensão às nossas características de entrada, que sempre será igual a 1:\n"
]
},
{
@ -271,7 +271,9 @@
{
"cell_type": "markdown",
"metadata": {},
"source": []
"source": [
"Agora vamos executar o treinamento em nosso conjunto de dados:\n"
]
},
{
"cell_type": "code",
@ -309,9 +311,9 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Como você pode ver, a precisão inicial é em torno de 50%, mas rapidamente aumenta para valores mais altos próximos de 90%.\n",
"Como você pode ver, a precisão inicial está em torno de 50%, mas rapidamente aumenta para valores mais altos, próximos de 90%.\n",
"\n",
"Vamos visualizar como as classes são separadas. Nossa função de classificação tem a forma $\\mathbf{w}^Tx$, e ela é maior que 0 para uma classe e menor que 0 para outra. Assim, a linha de separação das classes é definida por $\\mathbf{w}^Tx = 0$. Como temos apenas duas dimensões $x_0$ e $x_1$, a equação da linha seria $w_0x_0+w_1x_1+w_2 = 0$ (lembre-se de que definimos explicitamente uma dimensão extra $x_2=1$). Vamos plotar essa linha:\n"
"Vamos visualizar como as classes estão separadas. Nossa função de classificação tem a forma $\\mathbf{w}^Tx$, e ela é maior que 0 para uma classe e menor que 0 para outra. Assim, a linha de separação das classes é definida por $\\mathbf{w}^Tx = 0$. Como temos apenas duas dimensões, $x_0$ e $x_1$, a equação da linha seria $w_0x_0+w_1x_1+w_2 = 0$ (lembre-se de que definimos explicitamente uma dimensão extra $x_2=1$). Vamos plotar essa linha:\n"
]
},
{
@ -377,7 +379,7 @@
}
},
"source": [
"## Avaliar no Conjunto de Dados de Teste\n",
"## Avaliar no Conjunto de Teste\n",
"\n",
"No início, separamos alguns dados para o conjunto de teste. Vamos verificar quão preciso nosso classificador é nesse conjunto de teste. Para isso, também expandimos o conjunto de teste com uma dimensão extra, multiplicamos pela matriz de pesos e garantimos que o valor obtido tenha o mesmo sinal que o rótulo (+1 ou -1). Em seguida, somamos todos os valores booleanos e dividimos pelo tamanho da amostra de teste para obter a precisão:\n"
]
@ -420,7 +422,7 @@
"source": [
"## Observando o processo de treinamento\n",
"\n",
"Já vimos anteriormente como a precisão diminui durante o treinamento. Seria interessante observar como a linha de separação se comporta durante o treinamento. O código abaixo irá visualizar tudo em um único gráfico, e você poderá mover o controle deslizante para \"viajar no tempo\" ao longo do processo de treinamento.\n"
"Já vimos anteriormente como a precisão diminui durante o treinamento. Seria interessante observar como a linha de separação se comporta durante o treinamento. O código abaixo irá visualizar tudo em um único gráfico, e você poderá mover o controle deslizante para \"viajar no tempo\" através do processo de treinamento.\n"
]
},
{
@ -527,16 +529,16 @@
"source": [
"## Limitações do Perceptron\n",
"\n",
"Como você viu acima, o perceptron é um **classificador linear**. Ele consegue distinguir bem entre duas classes se elas forem **linearmente separáveis**, ou seja, se puderem ser separadas por uma linha reta. Caso contrário, o processo de treinamento do perceptron não irá convergir.\n",
"Como você viu acima, o perceptron é um **classificador linear**. Ele consegue distinguir bem entre duas classes se elas forem **linearmente separáveis**, ou seja, podem ser separadas por uma linha reta. Caso contrário, o processo de treinamento do perceptron não irá convergir.\n",
"\n",
"Um exemplo mais evidente de um problema que não pode ser resolvido por um perceptron é o chamado **problema do XOR**. Queremos que nosso perceptron aprenda a função booleana XOR, que possui a seguinte tabela verdade:\n",
"Um exemplo mais evidente de um problema que não pode ser resolvido por um perceptron é o chamado **problema XOR**. Queremos que nosso perceptron aprenda a função booleana XOR, que possui a seguinte tabela verdade:\n",
"\n",
"| | 0 | 1 |\n",
"|---|---|---|\n",
"| 0 | 0 | 1 | \n",
"| 1 | 1 | 0 |\n",
"\n",
"Vamos tentar fazer isso! Vamos preencher manualmente todos os exemplos de treinamento positivos e negativos e, em seguida, chamar nossa função de treinamento definida acima:\n"
"Vamos tentar fazer isso! Vamos preencher manualmente todas as amostras de treinamento positivas e negativas e, em seguida, chamar nossa função de treinamento definida acima:\n"
]
},
{
@ -605,17 +607,17 @@
"source": [
"Como você pode ver no gráfico acima, a precisão nunca ultrapassa 75%, porque é impossível traçar uma linha reta de forma a acertar todos os exemplos possíveis.\n",
"\n",
"O problema do XOR é um exemplo clássico das limitações do perceptron, e foi apontado por Marvin Minsky e Seymour Papert em 1969 no livro [Perceptrons](https://en.wikipedia.org/wiki/Perceptrons_(book)). Essa observação limitou as pesquisas na área de redes neurais por quase 10 anos, embora - e veremos isso na próxima seção do nosso curso - perceptrons com múltiplas camadas sejam perfeitamente capazes de resolver tais problemas.\n",
"O problema do XOR é um exemplo clássico das limitações do perceptron, e foi apontado por Marvin Minsky e Seymour Papert em 1969, no livro [Perceptrons](https://en.wikipedia.org/wiki/Perceptrons_(book)). Essa observação limitou as pesquisas na área de redes neurais por quase 10 anos, embora - e veremos isso na próxima seção do nosso curso - perceptrons com múltiplas camadas sejam perfeitamente capazes de resolver tais problemas.\n",
"\n",
"## Exemplo Complexo - MNIST\n",
"\n",
"Embora o perceptron não consiga resolver o problema do XOR, ele pode resolver problemas muito mais complexos, como o reconhecimento de caracteres manuscritos.\n",
"\n",
"Um conjunto de dados frequentemente usado ao aprender machine learning é chamado [MNIST](https://en.wikipedia.org/wiki/MNIST_database). Ele foi criado pelo Instituto Nacional de Padrões e Tecnologia Modificado (Modified National Institute of Standards and Technology) e contém um conjunto de treinamento com 60.000 dígitos manuscritos, coletados de cerca de 250 estudantes e funcionários do instituto. Há também um conjunto de teste com 10.000 dígitos, coletados de diferentes indivíduos.\n",
"Um conjunto de dados frequentemente utilizado para aprender machine learning é chamado de [MNIST](https://en.wikipedia.org/wiki/MNIST_database). Ele foi criado pelo Instituto Nacional de Padrões e Tecnologia Modificado (Modified National Institute of Standards and Technology) e contém um conjunto de treinamento com 60.000 dígitos manuscritos, coletados de cerca de 250 estudantes e funcionários do instituto. Há também um conjunto de teste com 10.000 dígitos, coletados de indivíduos diferentes.\n",
"\n",
"Todos os dígitos são representados por imagens em escala de cinza de tamanho 28x28 pixels.\n",
"Todos os dígitos são representados por imagens em escala de cinza com tamanho de 28x28 pixels.\n",
"\n",
"> O conjunto de dados MNIST está disponível como uma competição de treinamento no [Kaggle](https://www.kaggle.com/c/digit-recognizer), um site que hospeda competições e desafios de machine learning. Assim que você aprender a classificar os dígitos do MNIST, pode enviar sua solução para o Kaggle e ver como ela é avaliada em comparação com outros participantes.\n",
"> O conjunto de dados MNIST está disponível como uma competição de treinamento no [Kaggle](https://www.kaggle.com/c/digit-recognizer), um site que hospeda competições e desafios de machine learning. Assim que você aprender a classificar os dígitos do MNIST, pode enviar sua solução para o Kaggle para ver como ela é avaliada em comparação com outros participantes.\n",
"\n",
"Começamos carregando o conjunto de dados MNIST:\n"
]
@ -693,7 +695,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Como o perceptron é um classificador binário, limitaremos nosso problema ao reconhecimento de apenas dois dígitos. A função abaixo preencherá os arrays de amostras positivas e negativas com dois dígitos fornecidos (e também mostrará amostras desses dígitos para maior clareza).\n"
"Porque o perceptron é um classificador binário, limitaremos nosso problema ao reconhecimento de apenas dois dígitos. A função abaixo irá preencher os arrays de amostras positivas e negativas com dois dígitos fornecidos (e também mostrará amostras desses dígitos para maior clareza).\n"
]
},
{
@ -829,11 +831,11 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Observe como a precisão aumenta rapidamente até quase 100%.\n",
"Observe como a precisão aumenta rapidamente, chegando quase a 100%.\n",
"\n",
"Por favor, mova o controle deslizante para uma posição mais próxima do final do treinamento e observe a matriz de pesos plotada à esquerda. Essa matriz permitirá que você entenda como o perceptron realmente funciona. Você pode ver os valores altos de peso no meio do campo, que correspondem aos pixels que geralmente estão presentes no dígito 1, e valores negativos baixos nas laterais, onde estão partes do dígito 0. Assim, se o dígito apresentado ao perceptron for de fato 1, a parte central será multiplicada por valores altos, produzindo um resultado positivo. Por outro lado, quando o perceptron observa o dígito 0, os pixels correspondentes serão multiplicados por números negativos.\n",
"Por favor, mova o controle deslizante para uma posição próxima ao final do treinamento e observe a matriz de pesos plotada à esquerda. Essa matriz permitirá que você entenda como o perceptron realmente funciona. Você pode ver os valores altos de peso no meio do campo, que correspondem a pixels que geralmente estão presentes no dígito 1, e valores negativos baixos nas laterais, onde estão partes do dígito 0. Assim, se o dígito apresentado ao perceptron for de fato 1, a parte central será multiplicada por valores altos, produzindo um resultado positivo. Por outro lado, quando o perceptron observa o dígito 0, os pixels correspondentes serão multiplicados por números negativos.\n",
"\n",
"> Você pode perceber que, se dermos ao nosso perceptron um dígito 1 ligeiramente deslocado horizontalmente, de forma que seus pixels ocupem o lugar onde há partes verticais do dígito 0, podemos obter um resultado incorreto. Como a natureza do nosso conjunto de dados MNIST é tal que todos os dígitos estão centralizados e posicionados corretamente, o perceptron depende disso para distinguir entre os dígitos.\n",
"> Você pode notar que, se dermos ao perceptron um dígito 1 ligeiramente deslocado horizontalmente, de forma que seus pixels ocupem o lugar onde há partes verticais do dígito 0, podemos obter um resultado incorreto. Isso ocorre porque a natureza do nosso conjunto de dados MNIST é tal que todos os dígitos estão centralizados e posicionados corretamente, e o perceptron depende disso para distinguir entre os dígitos.\n",
"\n",
"Agora vamos tentar diferentes dígitos:\n"
]
@ -911,11 +913,11 @@
"source": [
"## Discussão\n",
"\n",
"Por algum motivo, 2 e 5 não são tão facilmente separáveis. Mesmo que obtenhamos uma precisão relativamente alta (acima de 85%), podemos claramente observar como o perceptron para de aprender em determinado momento.\n",
"Por algum motivo, 2 e 5 não são tão facilmente separáveis. Embora obtenhamos uma precisão relativamente alta (acima de 85%), podemos ver claramente como o perceptron para de aprender em determinado momento.\n",
"\n",
"Para entender por que isso acontece, podemos tentar usar a [Análise de Componentes Principais](https://en.wikipedia.org/wiki/Principal_component_analysis) (PCA). É uma técnica de aprendizado de máquina usada para reduzir a dimensionalidade do conjunto de dados de entrada, de forma a obter a melhor separação entre as classes.\n",
"Para entender por que isso acontece, podemos tentar usar a [Análise de Componentes Principais](https://pt.wikipedia.org/wiki/An%C3%A1lise_de_componentes_principais) (PCA). Trata-se de uma técnica de aprendizado de máquina usada para reduzir a dimensionalidade do conjunto de dados de entrada, de forma a obter a melhor separabilidade entre as classes.\n",
"\n",
"No nosso caso, uma imagem de entrada possui 784 pixels (características de entrada), e queremos usar o PCA para reduzir o número de parâmetros para apenas 2, para que possamos plotá-los em um gráfico. Esses dois parâmetros seriam uma combinação linear das características originais, e podemos visualizar esse procedimento como uma \"rotação\" do nosso espaço original de 784 dimensões, observando sua projeção no espaço 2D, até obtermos a melhor visualização que separa as classes.\n"
"No nosso caso, uma imagem de entrada possui 784 pixels (características de entrada), e queremos usar o PCA para reduzir o número de parâmetros para apenas 2, de modo que possamos plotá-los em um gráfico. Esses dois parâmetros seriam uma combinação linear das características originais, e podemos visualizar esse procedimento como uma \"rotação\" do nosso espaço original de 784 dimensões e a observação de sua projeção no nosso espaço 2D, até obtermos a melhor visualização que separa as classes.\n"
]
},
{
@ -1025,17 +1027,17 @@
}
},
"source": [
"Como você pode ver, 0 e 1 podem ser claramente separados por uma linha reta. Isso indica que, no espaço original de 784 dimensões, os pontos correspondentes aos dígitos também são linearmente separáveis. No caso de 2 e 5, não conseguimos encontrar uma projeção adequada que separe os dígitos de forma clara, e, por isso, há alguns casos de classificação incorreta.\n",
"Como você pode ver, 0 e 1 podem ser claramente separados por uma linha reta. Isso indica que, no espaço original de 784 dimensões, os pontos correspondentes aos dígitos também são linearmente separáveis. No caso de 2 e 5, não conseguimos encontrar uma boa projeção que separe os dígitos claramente, e, por isso, há alguns casos de classificação incorreta.\n",
"\n",
"> Mais adiante neste curso, aprenderemos como criar classificadores não lineares usando Redes Neurais e como lidar com o problema de dígitos que não estão devidamente alinhados. Muito em breve, alcançaremos mais de 99% de precisão na classificação de dígitos do MNIST, classificando-os em 10 classes diferentes.\n",
"> Mais adiante neste curso, aprenderemos como criar classificadores não lineares usando Redes Neurais e como lidar com o problema de dígitos que não estão devidamente alinhados. Muito em breve, alcançaremos uma precisão acima de 99% na classificação de dígitos do MNIST, classificando-os em 10 diferentes classes.\n",
"\n",
"## Conclusões\n",
"\n",
" * Aprendemos sobre a arquitetura mais simples de rede neural - o perceptron de uma camada.\n",
" * Implementamos o perceptron \"manualmente\", usando um procedimento de treinamento simples baseado em descida do gradiente.\n",
" * Implementamos o perceptron \"manualmente\", utilizando um procedimento de treinamento simples baseado no gradiente descendente.\n",
" * Apesar da simplicidade, o perceptron de uma camada pode resolver problemas relativamente complexos de reconhecimento de dígitos manuscritos.\n",
" * O perceptron de uma camada é um classificador linear e, portanto, oferece o mesmo poder de classificação que a regressão logística.\n",
" * No espaço amostral, o perceptron pode separar duas classes de dados de entrada usando um hiperplano.\n"
" * No espaço de amostras, o perceptron pode separar duas classes de dados de entrada usando um hiperplano.\n"
]
},
{
@ -1044,14 +1046,14 @@
"source": [
"## Créditos\n",
"\n",
"Este notebook faz parte do [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners) e foi preparado por [Dmitry Soshnikov](http://soshnikov.com). Ele é inspirado no Workshop de Redes Neurais da Microsoft Research Cambridge. Parte do código e dos materiais ilustrativos foram retirados de apresentações de [Katja Hoffmann](https://www.microsoft.com/en-us/research/people/kahofman/), [Matthew Johnson](https://www.microsoft.com/en-us/research/people/matjoh/) e [Ryoto Tomioka](https://www.microsoft.com/en-us/research/people/ryoto/), bem como do repositório [NeuroWorkshop](http://github.com/shwars/NeuroWorkshop).\n"
"Este notebook faz parte do [Currículo de IA para Iniciantes](http://github.com/microsoft/ai-for-beginners) e foi preparado por [Dmitry Soshnikov](http://soshnikov.com). Ele é inspirado no Workshop de Redes Neurais da Microsoft Research Cambridge. Parte do código e materiais ilustrativos foram retirados de apresentações de [Katja Hoffmann](https://www.microsoft.com/en-us/research/people/kahofman/), [Matthew Johnson](https://www.microsoft.com/en-us/research/people/matjoh/) e [Ryoto Tomioka](https://www.microsoft.com/en-us/research/people/ryoto/), além do repositório [NeuroWorkshop](http://github.com/shwars/NeuroWorkshop).\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Aviso Legal**: \nEste documento foi traduzido utilizando o serviço de tradução por IA [Co-op Translator](https://github.com/Azure/co-op-translator). Embora nos esforcemos para garantir a precisão, esteja ciente de que traduções automáticas podem conter erros ou imprecisões. O documento original em seu idioma nativo deve ser considerado a fonte oficial. Para informações críticas, recomenda-se a tradução profissional realizada por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações equivocadas decorrentes do uso desta tradução.\n"
"\n---\n\n**Aviso Legal**: \nEste documento foi traduzido utilizando o serviço de tradução por IA [Co-op Translator](https://github.com/Azure/co-op-translator). Embora nos esforcemos para garantir a precisão, é importante observar que traduções automatizadas podem conter erros ou imprecisões. O documento original em seu idioma nativo deve ser considerado a fonte oficial. Para informações críticas, recomenda-se a tradução profissional realizada por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações equivocadas decorrentes do uso desta tradução.\n"
]
}
],
@ -1080,8 +1082,8 @@
"start_slideshow_at": "selected"
},
"coopTranslator": {
"original_hash": "914fc55f59efc7e17b8130d4033ac617",
"translation_date": "2025-08-29T08:18:50+00:00",
"original_hash": "d67e5b54ba20b507aa88d71aa3d042d8",
"translation_date": "2025-10-03T13:23:18+00:00",
"source_file": "lessons/3-NeuralNetworks/03-Perceptron/Perceptron.ipynb",
"language_code": "br"
}

View File

@ -47,9 +47,9 @@
}
},
"source": [
"## Hračkový problém\n",
"## Ukázkový problém\n",
"\n",
"Začněme jednoduchým problémem, kde máme dva vstupní atributy. Například v medicíně můžeme chtít klasifikovat nádory na benigní a maligní, v závislosti na jejich velikosti a stáří.\n",
"Začněme jednoduchým problémem, kde máme dvě vstupní vlastnosti. Například v medicíně můžeme chtít klasifikovat nádory na benigní a maligní podle jejich velikosti a stáří.\n",
"\n",
"Vygenerujeme náhodný klasifikační dataset pomocí funkce `make_classification` z knihovny SciKit Learn:\n"
]
@ -154,7 +154,7 @@
"source": [
"## Perceptron\n",
"\n",
"Protože perceptron je binární klasifikátor, pro každý vstupní vektor $x$ bude výstup našeho perceptronu buď +1, nebo -1, v závislosti na třídě. Výstup bude vypočítán pomocí vzorce\n",
"Protože perceptron je binární klasifikátor, výstup našeho perceptronu pro každý vstupní vektor $x$ bude buď +1, nebo -1, v závislosti na třídě. Výstup se vypočítá podle vzorce\n",
"\n",
"$$y(\\mathbf{x}) = f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x})$$\n",
"\n",
@ -166,7 +166,7 @@
" \\end{cases} \\\\\n",
"$$\n",
"\n",
"Nicméně obecný lineární model by měl mít také bias (posun), tj. ideálně bychom měli $y$ počítat jako $y=f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}+\\mathbf{b})$. Abychom náš model zjednodušili, můžeme se tohoto biasu zbavit přidáním jedné další dimenze k našim vstupním prvkům, která bude vždy rovna 1:\n"
"Nicméně obecný lineární model by měl mít také bias, tj. ideálně bychom měli počítat $y$ jako $y=f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}+\\mathbf{b})$. Abychom náš model zjednodušili, můžeme se zbavit tohoto biasu přidáním jedné další dimenze k našim vstupním prvkům, která bude vždy rovna 1:\n"
]
},
{
@ -271,7 +271,9 @@
{
"cell_type": "markdown",
"metadata": {},
"source": []
"source": [
"Nyní spusťme trénink na našem datovém souboru:\n"
]
},
{
"cell_type": "code",
@ -311,7 +313,7 @@
"source": [
"Jak vidíte, počáteční přesnost je kolem 50 %, ale rychle se zvyšuje na vyšší hodnoty blízké 90 %.\n",
"\n",
"Pojďme si vizualizovat, jak jsou třídy odděleny. Naše klasifikační funkce vypadá jako $\\mathbf{w}^Tx$, a je větší než 0 pro jednu třídu a menší než 0 pro druhou. Linie oddělující třídy je tedy definována jako $\\mathbf{w}^Tx = 0$. Protože máme pouze dvě dimenze $x_0$ a $x_1$, rovnice pro tuto linii bude $w_0x_0+w_1x_1+w_2 = 0$ (nezapomeňte, že jsme explicitně definovali další dimenzi $x_2=1$). Pojďme tuto linii vykreslit:\n"
"Pojďme si vizualizovat, jak jsou třídy odděleny. Naše klasifikační funkce vypadá jako $\\mathbf{w}^Tx$, a je větší než 0 pro jednu třídu, a menší než 0 pro druhou. Linie oddělující třídy je tedy definována jako $\\mathbf{w}^Tx = 0$. Protože máme pouze dvě dimenze $x_0$ a $x_1$, rovnice pro tuto linii by byla $w_0x_0+w_1x_1+w_2 = 0$ (pamatujte, že jsme explicitně definovali další dimenzi $x_2=1$). Pojďme tuto linii vykreslit:\n"
]
},
{
@ -377,9 +379,9 @@
}
},
"source": [
"## Vyhodnocení na testovacím datasetu\n",
"## Vyhodnocení na testovacím datovém souboru\n",
"\n",
"Na začátku jsme oddělili část dat pro testovací dataset. Podívejme se, jak přesný je náš klasifikátor na tomto testovacím datasetu. Abychom to zjistili, rozšíříme testovací dataset o další rozměr, vynásobíme maticí vah a ověříme, že získaná hodnota má stejný znaménko jako štítek (+1 nebo -1). Poté sečteme všechny hodnoty typu boolean a vydělíme délkou testovacího vzorku, abychom získali přesnost:\n"
"Na začátku jsme oddělili část dat pro testovací datový soubor. Podívejme se, jak přesný je náš klasifikátor na tomto testovacím datovém souboru. Abychom to zjistili, rozšíříme testovací datový soubor o další rozměr, vynásobíme maticí vah a ověříme, že získaná hodnota má stejný znaménko jako štítek (+1 nebo -1). Poté sečteme všechny hodnoty typu boolean a vydělíme délkou testovacího vzorku, abychom získali přesnost:\n"
]
},
{
@ -418,9 +420,9 @@
}
},
"source": [
"## Pozorování tréninkového procesu\n",
"## Pozorování procesu tréninku\n",
"\n",
"Už jsme viděli, jak se během tréninku snižuje přesnost. Bylo by zajímavé sledovat, jak se během tréninku mění oddělovací čára. Kód níže zobrazí vše na jednom grafu a měli byste být schopni posouvat jezdcem a \"cestovat časem\" skrze tréninkový proces.\n"
"Už jsme viděli, jak se přesnost během tréninku snižuje. Bylo by zajímavé sledovat, jak se během tréninku chová separační čára. Níže uvedený kód vše vizualizuje na jednom grafu, a měli byste být schopni posouvat jezdec, abyste mohli \"cestovat časem\" skrz proces tréninku.\n"
]
},
{
@ -529,14 +531,14 @@
"\n",
"Jak jste viděli výše, perceptron je **lineární klasifikátor**. Dokáže dobře rozlišovat mezi dvěma třídami, pokud jsou **lineárně separovatelné**, tj. lze je oddělit přímkou. Jinak proces trénování perceptronu nebude konvergovat.\n",
"\n",
"Nejzřetelnějším příkladem problému, který nelze perceptronem vyřešit, je tzv. **XOR problém**. Chceme, aby se perceptron naučil logickou funkci XOR, která má následující pravdivostní tabulku:\n",
"Nejzřetelnějším příkladem problému, který nelze perceptronem vyřešit, je tzv. **XOR problém**. Chceme, aby se náš perceptron naučil booleovskou funkci XOR, která má následující pravdivostní tabulku:\n",
"\n",
"| | 0 | 1 |\n",
"|---|---|---|\n",
"| 0 | 0 | 1 | \n",
"| 1 | 1 | 0 |\n",
"\n",
"Pojďme to zkusit! Ručně zadáme všechny pozitivní a negativní tréninkové vzorky a poté zavoláme naši funkci train definovanou výše:\n"
"Pojďme to zkusit! Ručně vyplníme všechny pozitivní a negativní tréninkové vzorky a poté zavoláme naši funkci train definovanou výše:\n"
]
},
{
@ -603,19 +605,19 @@
}
},
"source": [
"Jak je vidět z výše uvedeného grafu, přesnost nikdy nepřekročí 75 %, protože není možné nakreslit přímku tak, aby správně pokryla všechny možné příklady.\n",
"Jak můžete vidět z grafu výše, přesnost nikdy nepřekročí 75 %, protože není možné nakreslit přímku tak, aby správně klasifikovala všechny příklady.\n",
"\n",
"Problém XOR je klasickým příkladem omezení perceptronu, na který upozornili Marvin Minsky a Seymour Papert v roce 1969 ve své knize [Perceptrons](https://en.wikipedia.org/wiki/Perceptrons_(book)). Toto zjištění omezilo výzkum v oblasti neuronových sítí téměř na 10 let, i když - jak uvidíme v další části našeho kurzu - vícevrstvé perceptrony jsou schopné takové problémy bez problémů řešit.\n",
"Problém XOR je klasickým příkladem omezení perceptronu, na který upozornili Marvin Minsky a Seymour Papert v roce 1969 ve své knize [Perceptrons](https://en.wikipedia.org/wiki/Perceptrons_(book)). Toto zjištění omezilo výzkum v oblasti neuronových sítí téměř na 10 let, i když - jak uvidíme v další části našeho kurzu - vícevrstvé perceptrony jsou schopné takové problémy vyřešit.\n",
"\n",
"## Složitý příklad - MNIST\n",
"\n",
"I když perceptron nedokáže vyřešit problém XOR, dokáže řešit mnohem složitější problémy, například rozpoznávání ručně psaných znaků.\n",
"I když perceptron nedokáže vyřešit problém XOR, dokáže vyřešit mnohem složitější problémy, například rozpoznávání ručně psaných znaků.\n",
"\n",
"Datová sada, která se často používá při osvojování strojového učení, se nazývá [MNIST](https://en.wikipedia.org/wiki/MNIST_database). Byla vytvořena Modifikovaným národním institutem pro standardy a technologie a obsahuje trénovací sadu 60 000 ručně psaných číslic, sesbíraných od přibližně 250 studentů a zaměstnanců institutu. Existuje také testovací sada obsahující 10 000 číslic, sesbíraných od různých jednotlivců.\n",
"Datová sada, která se často používá při zvládání strojového učení, se nazývá [MNIST](https://en.wikipedia.org/wiki/MNIST_database). Byla vytvořena Modifikovaným národním institutem standardů a technologie a obsahuje trénovací sadu 60 000 ručně psaných číslic, sesbíraných od přibližně 250 studentů a zaměstnanců institutu. K dispozici je také testovací sada 10 000 číslic, sesbíraných od různých jednotlivců.\n",
"\n",
"Všechny číslice jsou reprezentovány obrázky v odstínech šedi o velikosti 28x28 pixelů.\n",
"Všechny číslice jsou reprezentovány jako šedotónové obrázky o velikosti 28x28 pixelů.\n",
"\n",
"> Datová sada MNIST je dostupná jako tréninková soutěž na [Kaggle](https://www.kaggle.com/c/digit-recognizer), webu, který hostí soutěže a výzvy v oblasti strojového učení. Jakmile se naučíte klasifikovat číslice MNIST, můžete svůj výsledek odeslat na Kaggle a zjistit, jak je hodnocen mezi ostatními účastníky.\n",
"> Datová sada MNIST je dostupná jako tréninková soutěž na [Kaggle](https://www.kaggle.com/c/digit-recognizer), což je web, který hostí soutěže a výzvy v oblasti strojového učení. Jakmile se naučíte klasifikovat číslice z MNIST, můžete svůj výsledek odeslat na Kaggle a zjistit, jak je hodnocen mezi ostatními účastníky.\n",
"\n",
"Začneme načtením datové sady MNIST:\n"
]
@ -829,11 +831,11 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Všimněte si, jak přesnost velmi rychle dosahuje téměř 100 %.\n",
"Všimněte si, jak přesnost velmi rychle stoupá téměř na 100 %.\n",
"\n",
"Prosím, posuňte posuvník na nějakou pozici směrem ke konci tréninku a sledujte váhovou matici zobrazenou vlevo. Tato matice vám umožní pochopit, jak perceptron skutečně funguje. Můžete vidět vysoké hodnoty vah uprostřed pole, které odpovídají pixelům, jež jsou typicky přítomné u číslice 1, a nízké záporné hodnoty po stranách, kde se nacházejí části číslice 0. Pokud je tedy číslice předložená perceptronu skutečně 1, její střední část bude násobena vysokými hodnotami, což povede k pozitivnímu výsledku. Naopak, když perceptron pozoruje číslici 0, odpovídající pixely budou násobeny zápornými čísly.\n",
"Prosím, posuňte posuvník na nějakou pozici směrem ke konci trénování a podívejte se na matici vah zobrazenou vlevo. Tato matice vám umožní pochopit, jak perceptron skutečně funguje. Můžete vidět vysoké hodnoty vah uprostřed pole, které odpovídají pixelům, jež jsou typicky přítomné u číslice 1, a nízké negativní hodnoty po stranách, kde se nacházejí části číslice 0. Pokud je číslice předložená perceptronu skutečně 1, její střední část bude násobena vysokými hodnotami, což povede k pozitivnímu výsledku. Naopak, když perceptron pozoruje číslici 0, odpovídající pixely budou násobeny negativními čísly.\n",
"\n",
"> Můžete si všimnout, že pokud dáme našemu perceptronu číslici 1 mírně posunutou horizontálně, takže její pixely zaujmou místo, kde jsou vertikální části číslice 0, můžeme dostat nesprávný výsledek. Protože povaha našeho datasetu MNIST je taková, že všechny číslice jsou vycentrované a správně umístěné, perceptron na tom závisí při rozlišování mezi číslicemi.\n",
"> Můžete si všimnout, že pokud perceptronu předložíme číslici 1 mírně posunutou horizontálně, takže její pixely zaujmou místo, kde jsou vertikální části číslice 0, můžeme obdržet nesprávný výsledek. Vzhledem k tomu, že povaha našeho datasetu MNIST je taková, že všechny číslice jsou vycentrované a správně umístěné, perceptron na tom spoléhá při rozlišování mezi číslicemi.\n",
"\n",
"Teď zkusme různé číslice:\n"
]
@ -909,13 +911,13 @@
}
},
"source": [
"## Diskuze\n",
"## Diskuse\n",
"\n",
"Z nějakého důvodu není tak snadné oddělit 2 a 5. I když dosahujeme poměrně vysoké přesnosti (nad 85 %), je zřejmé, že perceptron v určitém bodě přestává učit.\n",
"Z nějakého důvodu nejsou čísla 2 a 5 tak snadno oddělitelná. I když dosahujeme poměrně vysoké přesnosti (nad 85 %), je zřejmé, že perceptron v určitém bodě přestává učit.\n",
"\n",
"Abychom pochopili, proč k tomu dochází, můžeme zkusit použít [Analýzu hlavních komponent](https://en.wikipedia.org/wiki/Principal_component_analysis) (PCA). Jedná se o techniku strojového učení, která se používá ke snížení dimenzionality vstupního datasetu tak, aby bylo dosaženo co nejlepší oddělitelnosti mezi třídami.\n",
"Abychom pochopili, proč k tomu dochází, můžeme použít [Analýzu hlavních komponent](https://en.wikipedia.org/wiki/Principal_component_analysis) (PCA). Jedná se o techniku strojového učení, která se používá ke snížení dimenzionality vstupního datového souboru tak, aby bylo dosaženo co nejlepší oddělitelnosti mezi třídami.\n",
"\n",
"V našem případě má vstupní obrázek 784 pixelů (vstupních prvků) a chceme použít PCA ke snížení počtu parametrů na pouhé 2, abychom je mohli vykreslit do grafu. Tyto dva parametry by byly lineární kombinací původních prvků a tento postup si můžeme představit jako „otáčení“ našeho původního 784-dimenzionálního prostoru a pozorování jeho projekce do 2D-prostoru, dokud nezískáme nejlepší pohled, který odděluje třídy.\n"
"V našem případě má vstupní obrázek 784 pixelů (vstupních atributů) a chceme použít PCA ke snížení počtu parametrů na pouhé 2, abychom je mohli vykreslit na grafu. Tyto dva parametry by byly lineární kombinací původních atributů a tento postup si můžeme představit jako „otáčení“ našeho původního 784-dimenzionálního prostoru a pozorování jeho projekce do 2D prostoru, dokud nezískáme nejlepší pohled, který odděluje třídy.\n"
]
},
{
@ -1025,17 +1027,17 @@
}
},
"source": [
"Jak vidíte, 0 a 1 lze jasně oddělit přímkou. To naznačuje, že v původním 784-dimenzionálním prostoru jsou body odpovídající číslicím také lineárně oddělitelné. V případě 2 a 5 však nemůžeme najít vhodnou projekci, která by číslice jasně oddělila, a proto dochází k některým případům špatné klasifikace.\n",
"Jak vidíte, 0 a 1 lze jasně oddělit přímkou. To naznačuje, že v původním 784-dimenzionálním prostoru jsou body odpovídající číslicím také lineárně oddělitelné. V případě číslic 2 a 5 však nelze najít vhodnou projekci, která by číslice jasně oddělila, a proto dochází k některým případům nesprávné klasifikace.\n",
"\n",
"> Později v tomto kurzu se naučíme, jak vytvářet nelineární klasifikátory pomocí neuronových sítí a jak řešit problém špatně zarovnaných číslic. Velmi brzy dosáhneme přesnosti nad 99 % při klasifikaci číslic MNIST, přičemž je budeme klasifikovat do 10 různých tříd.\n",
"> Později v tomto kurzu se naučíme, jak vytvořit nelineární klasifikátory pomocí neuronových sítí, a jak se vypořádat s problémem nesprávně zarovnaných číslic. Velmi brzy dosáhneme přesnosti nad 99 % při klasifikaci číslic MNIST, přičemž je budeme klasifikovat do 10 různých tříd.\n",
"\n",
"## Shrnutí\n",
"\n",
" * Naučili jsme se o nejjednodušší architektuře neuronové sítě - jednovrstvém perceptronu.\n",
" * Naučili jsme se o nejjednodušší architektuře neuronové sítě jednovrstvém perceptronu.\n",
" * Implementovali jsme perceptron \"ručně\" pomocí jednoduchého tréninkového postupu založeného na gradientním sestupu.\n",
" * Navzdory své jednoduchosti dokáže jednovrstvý perceptron řešit poměrně složité problémy rozpoznávání ručně psaných číslic.\n",
" * Jednovrstvý perceptron je lineární klasifikátor, a proto poskytuje stejnou klasifikační sílu jako logistická regrese.\n",
" * V prostoru vzorků že perceptron oddělit dvě třídy vstupních dat pomocí hyperroviny.\n"
" * V prostoru vzorků dokáže perceptron oddělit dvě třídy vstupních dat pomocí hyperroviny.\n"
]
},
{
@ -1051,7 +1053,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Prohlášení**: \nTento dokument byl přeložen pomocí služby pro automatický překlad [Co-op Translator](https://github.com/Azure/co-op-translator). I když se snažíme o přesnost, mějte prosím na paměti, že automatické překlady mohou obsahovat chyby nebo nepřesnosti. Původní dokument v jeho původním jazyce by měl být považován za závazný zdroj. Pro důležité informace doporučujeme profesionální lidský překlad. Neodpovídáme za žádná nedorozumění nebo nesprávné výklady vyplývající z použití tohoto překladu.\n"
"\n---\n\n**Prohlášení**: \nTento dokument byl přeložen pomocí služby AI pro překlad [Co-op Translator](https://github.com/Azure/co-op-translator). I když se snažíme o přesnost, mějte prosím na paměti, že automatické překlady mohou obsahovat chyby nebo nepřesnosti. Původní dokument v jeho rodném jazyce by měl být považován za autoritativní zdroj. Pro důležité informace se doporučuje profesionální lidský překlad. Nejsme zodpovědní za jakékoli nedorozumění nebo nesprávné interpretace vyplývající z použití tohoto překladu.\n"
]
}
],
@ -1080,8 +1082,8 @@
"start_slideshow_at": "selected"
},
"coopTranslator": {
"original_hash": "914fc55f59efc7e17b8130d4033ac617",
"translation_date": "2025-08-29T15:03:21+00:00",
"original_hash": "d67e5b54ba20b507aa88d71aa3d042d8",
"translation_date": "2025-10-03T13:41:00+00:00",
"source_file": "lessons/3-NeuralNetworks/03-Perceptron/Perceptron.ipynb",
"language_code": "cs"
}

View File

@ -11,9 +11,9 @@
"source": [
"## Perceptron\n",
"\n",
"> Denne notebook er en del af [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners). Besøg repositoryen for et komplet sæt af læringsmaterialer.\n",
"> Denne notebook er en del af [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners). Besøg repositoriet for et komplet sæt af læringsmaterialer.\n",
"\n",
"Som vi har diskuteret, giver perceptron dig mulighed for at løse **binære klassifikationsproblemer**, dvs. at klassificere inputeksempler i to klasser - vi kan kalde dem **positive** og **negative**.\n",
"Som vi har diskuteret, giver perceptronen dig mulighed for at løse **binære klassifikationsproblemer**, dvs. at klassificere inputeksempler i to klasser - vi kan kalde dem **positive** og **negative**.\n",
"\n",
"Lad os først importere nogle nødvendige biblioteker.\n"
]
@ -49,7 +49,7 @@
"source": [
"## Legetøjsproblem\n",
"\n",
"Lad os starte med et simpelt problem, hvor vi har to inputfunktioner. For eksempel, inden for medicin kan vi ønske at klassificere tumorer som enten godartede eller ondartede, afhængigt af deres størrelse og alder.\n",
"Lad os starte med et legetøjsproblem, hvor vi har to inputfunktioner. For eksempel, inden for medicin kan vi ønske at klassificere tumorer som godartede eller ondartede, afhængigt af deres størrelse og alder.\n",
"\n",
"Vi vil generere et tilfældigt klassifikationsdatasæt ved hjælp af funktionen `make_classification` fra SciKit Learn-biblioteket:\n"
]
@ -154,11 +154,11 @@
"source": [
"## Perceptron\n",
"\n",
"Da perceptron er en binær klassifikator, vil outputtet fra vores perceptron for hver inputvektor $x$ være enten +1 eller -1, afhængigt af klassen. Outputtet beregnes ved hjælp af formlen\n",
"Da perceptron er en binær klassifikator, vil output for hver inputvektor $x$ fra vores perceptron være enten +1 eller -1, afhængigt af klassen. Outputtet beregnes ved hjælp af formlen\n",
"\n",
"$$y(\\mathbf{x}) = f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x})$$\n",
"\n",
"hvor $\\mathbf{w}$ er en vægtvektor, og $f$ er en trinaktiveringsfunktion:\n",
"hvor $\\mathbf{w}$ er en vægtvektor, og $f$ er en step-aktiveringsfunktion:\n",
"$$\n",
"f(x) = \\begin{cases}\n",
" +1 & x \\geq 0 \\\\\n",
@ -206,14 +206,14 @@
"source": [
"## Træningsalgoritme\n",
"\n",
"For at træne perceptronen skal vi finde vægte $\\mathbf{w}$, der minimerer fejlen. Fejlen defineres ved hjælp af **perceptron-kriteriet**:\n",
"For at træne perceptronen skal vi finde vægte $\\mathbf{w}$, der minimerer fejlen. Fejlen defineres ved hjælp af **perceptronkriteriet**:\n",
"\n",
"$$E(\\mathbf{w}) = -\\sum_{n \\in \\mathcal{M}}\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}_{n}t_{n}$$\n",
" \n",
" * $t_{n} \\in \\{-1, +1\\}$ for henholdsvis negative og positive træningsprøver\n",
" * $\\mathcal{M}$ - et sæt af forkert klassificerede eksempler\n",
" \n",
"Vi vil bruge processen **gradient descent**. Med udgangspunkt i nogle tilfældige startvægte $\\mathbf{w}^{(0)}$ justerer vi vægtene ved hvert trin i træningen ved hjælp af gradienten af $E$:\n",
"Vi vil anvende processen **gradientnedstigning**. Startende med nogle tilfældige initialvægte $\\mathbf{w}^{(0)}$, justerer vi vægtene ved hvert trin i træningen ved hjælp af gradienten af $E$:\n",
"\n",
"$$\\mathbf{w}^{\\tau + 1}=\\mathbf{w}^{\\tau} - \\eta \\nabla E(\\mathbf{w}) = \\mathbf{w}^{\\tau} + \\eta\\sum_{n \\in \\mathcal{M}}\\mathbf{x}_{n} t_{n}$$\n",
"\n",
@ -271,7 +271,9 @@
{
"cell_type": "markdown",
"metadata": {},
"source": []
"source": [
"Lad os nu køre træningen på vores datasæt:\n"
]
},
{
"cell_type": "code",
@ -309,9 +311,9 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Som du kan se, er den oprindelige nøjagtighed omkring 50 %, men den stiger hurtigt til højere værdier tæt på 90 %.\n",
"Som du kan se, starter nøjagtigheden omkring 50 %, men den stiger hurtigt til højere værdier tæt på 90 %.\n",
"\n",
"Lad os visualisere, hvordan klasserne adskilles. Vores klassifikationsfunktion ser ud som $\\mathbf{w}^Tx$, og den er større end 0 for den ene klasse og mindre end 0 for den anden. Derfor defineres klassens adskillelseslinje af $\\mathbf{w}^Tx = 0$. Da vi kun har to dimensioner $x_0$ og $x_1$, vil ligningen for linjen være $w_0x_0+w_1x_1+w_2 = 0$ (husk, at vi eksplicit har defineret en ekstra dimension $x_2=1$). Lad os plotte denne linje:\n"
"Lad os visualisere, hvordan klasserne adskilles. Vores klassifikationsfunktion ser ud som $\\mathbf{w}^Tx$, og den er større end 0 for den ene klasse og mindre end 0 for den anden. Derfor defineres klasseseparationslinjen af $\\mathbf{w}^Tx = 0$. Da vi kun har to dimensioner $x_0$ og $x_1$, vil ligningen for linjen være $w_0x_0+w_1x_1+w_2 = 0$ (husk, at vi eksplicit har defineret en ekstra dimension $x_2=1$). Lad os plotte denne linje:\n"
]
},
{
@ -377,9 +379,9 @@
}
},
"source": [
"## Evaluer på Testdatasæt\n",
"## Evaluér på Testdatasæt\n",
"\n",
"I starten har vi lagt noget data til side til testdatasættet. Lad os se, hvor præcis vores klassifikator er på dette testdatasæt. For at gøre dette udvider vi også testdatasættet med en ekstra dimension, multiplicerer med vægtsmatricen og sikrer, at den opnåede værdi har samme fortegn som mærkaten (+1 eller -1). Derefter summerer vi alle boolske værdier og dividerer med længden af testprøven for at opnå nøjagtigheden:\n"
"I starten har vi lagt noget data til side til testdatasættet. Lad os se, hvor præcis vores klassifikator er på dette testdatasæt. For at gøre dette udvider vi også testdatasættet med en ekstra dimension, multiplicerer med vægtsmatricen og sikrer, at den opnåede værdi har samme fortegn som etiketten (+1 eller -1). Derefter summerer vi alle boolske værdier og dividerer med længden af testprøven for at få nøjagtigheden:\n"
]
},
{
@ -418,7 +420,7 @@
}
},
"source": [
"## Observere træningsprocessen\n",
"## Observering træningsprocessen\n",
"\n",
"Vi har tidligere set, hvordan nøjagtigheden falder under træningen. Det kunne være interessant at se, hvordan separationslinjen opfører sig under træningen. Koden nedenfor vil visualisere alt på én graf, og du bør kunne flytte skyderen for at \"rejse i tiden\" gennem træningsprocessen.\n"
]
@ -527,9 +529,9 @@
"source": [
"## Begrænsninger ved Perceptron\n",
"\n",
"Som du har set ovenfor, er perceptron en **lineær klassifikator**. Den kan skelne mellem to klasser godt, hvis de er **lineært adskillelige**, dvs. kan adskilles med en lige linje. Ellers vil perceptronens træningsproces ikke konvergere.\n",
"Som du har set ovenfor, er perceptron en **lineær klassifikator**. Den kan skelne godt mellem to klasser, hvis de er **lineært separable**, dvs. kan adskilles med en lige linje. Ellers vil perceptronens træningsproces ikke konvergere.\n",
"\n",
"Et af de mest oplagte eksempler på et problem, der ikke kan løses af en perceptron, er det såkaldte **XOR-problem**. Vi ønsker, at vores perceptron skal lære den booleske XOR-funktion, som har følgende sandhedstabel:\n",
"Et meget tydeligt eksempel på et problem, der ikke kan løses af en perceptron, er det såkaldte **XOR-problem**. Vi ønsker, at vores perceptron skal lære den boolske XOR-funktion, som har følgende sandhedstabel:\n",
"\n",
"| | 0 | 1 |\n",
"|---|---|---|\n",
@ -603,19 +605,19 @@
}
},
"source": [
"Som det fremgår af grafen ovenfor, overstiger nøjagtigheden aldrig 75 %, fordi det er umuligt at tegne en lige linje, der korrekt klassificerer alle mulige eksempler.\n",
"Som du kan se på grafen ovenfor, overstiger nøjagtigheden aldrig 75 %, fordi det er umuligt at tegne en lige linje, der kan klassificere alle eksempler korrekt.\n",
"\n",
"XOR-problemet er et klassisk eksempel på begrænsningerne ved perceptroner, og det blev påpeget af Marvin Minsky og Seymour Papert i 1969 i deres bog [Perceptrons](https://en.wikipedia.org/wiki/Perceptrons_(book)). Denne observation begrænsede forskningen inden for neurale netværk i næsten 10 år, selvom - som vi vil se i næste afsnit af vores kursus - flerlags-perceptroner er fuldt ud i stand til at løse sådanne problemer.\n",
"XOR-problemet er et klassisk eksempel på begrænsningerne ved perceptroner, og det blev påpeget af Marvin Minsky og Seymour Papert i 1969 i deres bog [Perceptrons](https://en.wikipedia.org/wiki/Perceptrons_(book)). Denne observation begrænsede forskningen inden for neurale netværk i næsten 10 år, selvom - som vi vil se i næste afsnit af vores kursus - flerlagede perceptroner er fuldt ud i stand til at løse sådanne problemer.\n",
"\n",
"## Kompleks Eksempel - MNIST\n",
"## Komplekst eksempel - MNIST\n",
"\n",
"Selvom en perceptron ikke kan løse XOR-problemet, kan den løse mange mere komplekse problemer, såsom genkendelse af håndskrevne tegn.\n",
"Selvom perceptroner ikke kan løse XOR-problemet, kan de løse mange mere komplekse problemer, såsom genkendelse af håndskrevne tegn.\n",
"\n",
"Et datasæt, der ofte bruges, når man lærer maskinlæring, kaldes [MNIST](https://en.wikipedia.org/wiki/MNIST_database). Det blev skabt af Modified National Institute of Standards and Technology og indeholder et træningssæt med 60.000 håndskrevne cifre, indsamlet fra omkring 250 studerende og ansatte på instituttet. Der er også et testdatasæt med 10.000 cifre, indsamlet fra forskellige personer.\n",
"Et datasæt, der ofte bruges, når man lærer maskinlæring, kaldes [MNIST](https://en.wikipedia.org/wiki/MNIST_database). Det er blevet oprettet af Modified National Institute of Standards and Technology og indeholder et træningssæt med 60.000 håndskrevne cifre, indsamlet fra omkring 250 studerende og ansatte på instituttet. Der er også et testdatasæt med 10.000 cifre, indsamlet fra forskellige personer.\n",
"\n",
"Alle cifre er repræsenteret som gråtonede billeder i størrelsen 28x28 pixels.\n",
"Alle cifre er repræsenteret ved gråtonede billeder med en størrelse på 28x28 pixels.\n",
"\n",
"> MNIST-datasættet er tilgængeligt som en træningskonkurrence på [Kaggle](https://www.kaggle.com/c/digit-recognizer), en side, der afholder konkurrencer og udfordringer inden for maskinlæring. Når du har lært at klassificere MNIST-cifre, kan du indsende din løsning til Kaggle for at se, hvordan den vurderes blandt andre deltagere.\n",
"> MNIST-datasættet er tilgængeligt som en træningskonkurrence på [Kaggle](https://www.kaggle.com/c/digit-recognizer), en hjemmeside, der afholder konkurrencer og udfordringer inden for maskinlæring. Når du har lært at klassificere MNIST-cifre, kan du indsende din løsning til Kaggle for at se, hvordan den vurderes blandt andre deltagere.\n",
"\n",
"Vi starter med at indlæse MNIST-datasættet:\n"
]
@ -829,13 +831,13 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Bemærk, hvordan nøjagtigheden stiger næsten til 100 % meget hurtigt.\n",
"Bemærk, hvordan nøjagtigheden stiger til næsten 100% meget hurtigt.\n",
"\n",
"Prøv at flytte skyderen til en position tættere på slutningen af træningen, og observer vægtmatricen, der er afbildet til venstre. Denne matrix giver dig mulighed for at forstå, hvordan perceptronen faktisk fungerer. Du kan se de høje vægtværdier i midten af feltet, som svarer til pixels, der typisk er til stede for tallet 1, og lave negative værdier i siderne, hvor dele af tallet 0 er. Så hvis det tal, der præsenteres for perceptronen, faktisk er 1, vil midterdelen blive ganget med høje værdier, hvilket giver et positivt resultat. Omvendt, når perceptronen ser et 0, vil de tilsvarende pixels blive ganget med negative tal.\n",
"Flyt venligst skyderen til en position mod slutningen af træningen, og observer vægtmatricen, der er plottet til venstre. Denne matrix vil hjælpe dig med at forstå, hvordan perceptronen faktisk fungerer. Du kan se de høje vægtværdier i midten af feltet, som svarer til pixels, der typisk er til stede for tallet 1, og lave negative værdier langs siderne, hvor dele af tallet 0 er. Så hvis det tal, der præsenteres for perceptronen, faktisk er 1, vil den midterste del af det blive multipliceret med høje værdier, hvilket giver et positivt resultat. Omvendt, når perceptronen observerer 0, vil de tilsvarende pixels blive multipliceret med negative tal.\n",
"\n",
"> Du bemærker måske, at hvis vi giver vores perceptron et tal 1, der er let forskudt horisontalt, så dets pixels optager det sted, hvor der er lodrette dele af 0, kan vi få et forkert resultat. Da naturen af vores MNIST-datasæt er sådan, at alle cifre er centreret og korrekt placeret, er perceptronen afhængig af dette for at skelne mellem tallene.\n",
"> Du kan bemærke, at hvis vi giver vores perceptron et 1-tal, der er en smule forskudt horisontalt, så dets pixels optager det sted, hvor der er vertikale dele af 0, kan vi få et forkert resultat. Da naturen af vores MNIST-datasæt er sådan, at alle tal er centreret og korrekt positioneret, og perceptronen er afhængig af dette for at skelne mellem tallene.\n",
"\n",
"Lad os nu prøve forskellige cifre:\n"
"Lad os nu prøve forskellige tal:\n"
]
},
{
@ -1025,17 +1027,17 @@
}
},
"source": [
"Som du kan se, kan 0 og 1 tydeligt adskilles af en lige linje. Dette indikerer, at i det oprindelige 784-dimensionelle rum er punkterne, der svarer til cifrene, også lineært adskillelige. I tilfældet med 2 og 5 kan vi ikke finde en god projektion, der klart adskiller cifrene, og derfor er der nogle tilfælde af forkert klassifikation.\n",
"Som du kan se, kan 0 og 1 tydeligt adskilles med en lige linje. Dette viser, at punkterne, der svarer til cifrene, også er lineært adskillelige i det oprindelige 784-dimensionelle rum. I tilfældet med 2 og 5 kan vi ikke finde en god projektion, der klart adskiller cifrene, og derfor opstår der nogle tilfælde af forkert klassifikation.\n",
"\n",
"> Senere i dette kursus vil vi lære, hvordan man skaber ikke-lineære klassifikatorer ved hjælp af neurale netværk, og hvordan man håndterer problemet med cifre, der ikke er korrekt justeret. Meget snart vil vi opnå over 99% nøjagtighed i klassificeringen af MNIST-cifre, mens vi klassificerer dem i 10 forskellige klasser.\n",
"> Senere i dette kursus vil vi lære, hvordan man skaber ikke-lineære klassifikatorer ved hjælp af neurale netværk, og hvordan man håndterer problemet med cifre, der ikke er korrekt justeret. Meget snart vil vi opnå over 99% nøjagtighed i MNIST-cifferklassifikation, mens vi klassificerer dem i 10 forskellige klasser.\n",
"\n",
"## Opsummering\n",
"## Vigtigste pointer\n",
"\n",
" * Vi har lært om den simpleste neurale netværksarkitektur - etlaget perceptron.\n",
" * Vi har implementeret perceptronet \"manuelt\" ved hjælp af en simpel træningsprocedure baseret på gradientnedstigning.\n",
" * På trods af sin enkelhed kan et etlaget perceptron løse ret komplekse problemer med genkendelse af håndskrevne cifre.\n",
" * Et etlaget perceptron er en lineær klassifikator og har derfor samme klassifikationskraft som logistisk regression.\n",
" * I det samplede rum kan perceptronet adskille to klasser af inputdata ved hjælp af et hyperplan.\n"
" * Vi har lært om den simpleste neurale netværksarkitektur - én-lags perceptron.\n",
" * Vi har implementeret perceptronen \"manuelt\" ved hjælp af en simpel træningsprocedure baseret på gradientnedstigning.\n",
" * På trods af sin enkelhed kan én-lags perceptron løse ret komplekse problemer med håndskrevet ciffergenkendelse.\n",
" * Én-lags perceptron er en lineær klassifikator og har derfor samme klassifikationskraft som logistisk regression.\n",
" * I det samplede rum kan perceptronen adskille to klasser af inputdata ved hjælp af et hyperplan.\n"
]
},
{
@ -1044,14 +1046,14 @@
"source": [
"## Kreditering\n",
"\n",
"Denne notebook er en del af [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners) og er udarbejdet af [Dmitry Soshnikov](http://soshnikov.com). Den er inspireret af Neural Network Workshop hos Microsoft Research Cambridge. Noget af koden og de illustrative materialer er taget fra præsentationer af [Katja Hoffmann](https://www.microsoft.com/en-us/research/people/kahofman/), [Matthew Johnson](https://www.microsoft.com/en-us/research/people/matjoh/) og [Ryoto Tomioka](https://www.microsoft.com/en-us/research/people/ryoto/), samt fra [NeuroWorkshop](http://github.com/shwars/NeuroWorkshop)-repositoryet.\n"
"Denne notebook er en del af [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners) og er udarbejdet af [Dmitry Soshnikov](http://soshnikov.com). Den er inspireret af Neural Network Workshop hos Microsoft Research Cambridge. Noget kode og illustrativt materiale er taget fra præsentationer af [Katja Hoffmann](https://www.microsoft.com/en-us/research/people/kahofman/), [Matthew Johnson](https://www.microsoft.com/en-us/research/people/matjoh/) og [Ryoto Tomioka](https://www.microsoft.com/en-us/research/people/ryoto/), samt fra [NeuroWorkshop](http://github.com/shwars/NeuroWorkshop)-repositoryet.\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Ansvarsfraskrivelse**: \nDette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på nøjagtighed, skal det bemærkes, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi påtager os intet ansvar for misforståelser eller fejltolkninger, der måtte opstå som følge af brugen af denne oversættelse.\n"
"\n---\n\n**Ansvarsfraskrivelse**: \nDette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på nøjagtighed, skal det bemærkes, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi påtager os ikke ansvar for misforståelser eller fejltolkninger, der måtte opstå som følge af brugen af denne oversættelse.\n"
]
}
],
@ -1080,8 +1082,8 @@
"start_slideshow_at": "selected"
},
"coopTranslator": {
"original_hash": "914fc55f59efc7e17b8130d4033ac617",
"translation_date": "2025-08-29T08:30:49+00:00",
"original_hash": "d67e5b54ba20b507aa88d71aa3d042d8",
"translation_date": "2025-10-03T13:30:22+00:00",
"source_file": "lessons/3-NeuralNetworks/03-Perceptron/Perceptron.ipynb",
"language_code": "da"
}

View File

@ -11,9 +11,9 @@
"source": [
"## Perzeptron\n",
"\n",
"> Dieses Notebook ist Teil des [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners). Besuchen Sie das Repository für das vollständige Set an Lernmaterialien.\n",
"> Dieses Notebook ist Teil des [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners). Besuchen Sie das Repository für das vollständige Lernmaterial.\n",
"\n",
"Wie wir besprochen haben, ermöglicht der Perzeptron die Lösung von **binären Klassifikationsproblemen**, d. h. die Klassifizierung von Eingabebeispielen in zwei Klassen wir können sie **positiv** und **negativ** nennen.\n",
"Wie bereits besprochen, ermöglicht der Perzeptron die Lösung von **Binärklassifikationsproblemen**, d. h. die Klassifizierung von Eingabebeispielen in zwei Klassen wir können sie **positiv** und **negativ** nennen.\n",
"\n",
"Zunächst importieren wir einige benötigte Bibliotheken.\n"
]
@ -166,7 +166,7 @@
" \\end{cases} \\\\\n",
"$$\n",
"\n",
"Ein generisches lineares Modell sollte jedoch auch einen Bias enthalten, d.h. idealerweise sollten wir $y$ als $y=f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}+\\mathbf{b})$ berechnen. Um unser Modell zu vereinfachen, können wir diesen Bias-Term eliminieren, indem wir unseren Eingabefeatures eine zusätzliche Dimension hinzufügen, die immer den Wert 1 hat:\n"
"Ein generisches lineares Modell sollte jedoch auch einen Bias enthalten, d.h. idealerweise sollten wir $y$ als $y=f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}+\\mathbf{b})$ berechnen. Um unser Modell zu vereinfachen, können wir diesen Bias-Term eliminieren, indem wir eine zusätzliche Dimension zu unseren Eingabefeatures hinzufügen, die immer den Wert 1 hat:\n"
]
},
{
@ -217,7 +217,7 @@
"\n",
"$$\\mathbf{w}^{\\tau + 1}=\\mathbf{w}^{\\tau} - \\eta \\nabla E(\\mathbf{w}) = \\mathbf{w}^{\\tau} + \\eta\\sum_{n \\in \\mathcal{M}}\\mathbf{x}_{n} t_{n}$$\n",
"\n",
"wobei $\\eta$ die **Lernrate** ist und $\\tau\\in\\mathbb{N}$ die Anzahl der Iterationen darstellt.\n",
"wobei $\\eta$ die **Lernrate** ist und $\\tau\\in\\mathbb{N}$ die Anzahl der Iterationen.\n",
"\n",
"Lassen Sie uns diesen Algorithmus in Python definieren:\n"
]
@ -271,7 +271,9 @@
{
"cell_type": "markdown",
"metadata": {},
"source": []
"source": [
"Lassen Sie uns nun das Training auf unserem Datensatz durchführen:\n"
]
},
{
"cell_type": "code",
@ -309,9 +311,9 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Wie Sie sehen, liegt die anfängliche Genauigkeit bei etwa 50 %, steigt jedoch schnell auf höhere Werte nahe 90 %.\n",
"Wie Sie sehen, liegt die anfängliche Genauigkeit bei etwa 50 %, steigt jedoch schnell auf höhere Werte nahe 90 % an.\n",
"\n",
"Visualisieren wir, wie die Klassen getrennt werden. Unsere Klassifikationsfunktion sieht aus wie $\\mathbf{w}^Tx$, und sie ist größer als 0 für die eine Klasse und kleiner als 0 für die andere. Daher wird die Trennlinie der Klassen durch $\\mathbf{w}^Tx = 0$ definiert. Da wir nur zwei Dimensionen $x_0$ und $x_1$ haben, lautet die Gleichung für die Linie $w_0x_0+w_1x_1+w_2 = 0$ (denken Sie daran, dass wir explizit eine zusätzliche Dimension $x_2=1$ definiert haben). Lassen Sie uns diese Linie zeichnen:\n"
"Lassen Sie uns visualisieren, wie die Klassen getrennt werden. Unsere Klassifikationsfunktion sieht wie $\\mathbf{w}^Tx$ aus und ist für eine Klasse größer als 0 und für die andere kleiner als 0. Daher wird die Trennlinie der Klassen durch $\\mathbf{w}^Tx = 0$ definiert. Da wir nur zwei Dimensionen $x_0$ und $x_1$ haben, lautet die Gleichung für die Linie $w_0x_0+w_1x_1+w_2 = 0$ (denken Sie daran, dass wir explizit eine zusätzliche Dimension $x_2=1$ definiert haben). Lassen Sie uns diese Linie zeichnen:\n"
]
},
{
@ -379,7 +381,7 @@
"source": [
"## Bewertung auf dem Testdatensatz\n",
"\n",
"Zu Beginn haben wir einige Daten für den Testdatensatz beiseitegelegt. Lassen Sie uns überprüfen, wie genau unser Klassifikator auf diesem Testdatensatz ist. Dazu erweitern wir den Testdatensatz um eine zusätzliche Dimension, multiplizieren ihn mit der Gewichtsmatrix und stellen sicher, dass der erhaltene Wert das gleiche Vorzeichen wie das Label hat (+1 oder -1). Anschließend summieren wir alle booleschen Werte und teilen durch die Länge der Testprobe, um die Genauigkeit zu erhalten:\n"
"Zu Beginn haben wir einige Daten für den Testdatensatz beiseitegelegt. Schauen wir uns an, wie genau unser Klassifikator auf diesem Testdatensatz ist. Dafür erweitern wir den Testdatensatz um eine zusätzliche Dimension, multiplizieren ihn mit der Gewichtsmatrix und stellen sicher, dass der erhaltene Wert das gleiche Vorzeichen wie das Label hat (+1 oder -1). Anschließend summieren wir alle booleschen Werte und teilen durch die Länge der Testprobe, um die Genauigkeit zu berechnen:\n"
]
},
{
@ -420,7 +422,7 @@
"source": [
"## Beobachtung des Trainingsprozesses\n",
"\n",
"Wir haben bereits gesehen, wie die Genauigkeit während des Trainings abnimmt. Es wäre interessant zu sehen, wie sich die Trennlinie während des Trainings verhält. Der folgende Code visualisiert alles in einem einzigen Diagramm, und Sie sollten in der Lage sein, den Schieberegler zu bewegen, um durch den Trainingsprozess zu \"reisen\".\n"
"Wir haben zuvor gesehen, wie die Genauigkeit während des Trainings abnimmt. Es wäre interessant zu sehen, wie sich die Trennlinie während des Trainings verhält. Der untenstehende Code wird alles in einem Diagramm visualisieren, und Sie sollten in der Lage sein, den Schieberegler zu bewegen, um durch den Trainingsprozess \"zeitzureisen\".\n"
]
},
{
@ -529,14 +531,14 @@
"\n",
"Wie oben gezeigt, ist das Perzeptron ein **linearer Klassifikator**. Es kann zwei Klassen gut unterscheiden, wenn sie **linear trennbar** sind, d. h. durch eine gerade Linie getrennt werden können. Andernfalls wird der Trainingsprozess des Perzeptrons nicht konvergieren.\n",
"\n",
"Ein offensichtliches Beispiel für ein Problem, das nicht durch ein Perzeptron gelöst werden kann, ist das sogenannte **XOR-Problem**. Wir möchten, dass unser Perzeptron die XOR-Boolesche Funktion lernt, die folgende Wahrheitstabelle hat:\n",
"Ein offensichtliches Beispiel für ein Problem, das nicht durch ein Perzeptron gelöst werden kann, ist das sogenannte **XOR-Problem**. Wir möchten, dass unser Perzeptron die XOR-Logikfunktion lernt, die folgende Wahrheitstabelle hat:\n",
"\n",
"| | 0 | 1 |\n",
"|---|---|---|\n",
"| 0 | 0 | 1 | \n",
"| 1 | 1 | 0 |\n",
"\n",
"Lassen Sie uns das ausprobieren! Wir werden manuell alle positiven und negativen Trainingsbeispiele einfügen und dann unsere oben definierte Trainingsfunktion aufrufen:\n"
"Versuchen wir es! Wir werden manuell alle positiven und negativen Trainingsbeispiele einfügen und dann unsere oben definierte Trainingsfunktion aufrufen:\n"
]
},
{
@ -603,19 +605,19 @@
}
},
"source": [
"Wie aus der obigen Grafik ersichtlich, überschreitet die Genauigkeit niemals 75 %, da es unmöglich ist, eine gerade Linie so zu ziehen, dass alle möglichen Beispiele korrekt erfasst werden.\n",
"Wie aus dem obigen Diagramm ersichtlich, überschreitet die Genauigkeit niemals 75 %, da es unmöglich ist, eine gerade Linie so zu ziehen, dass alle möglichen Beispiele korrekt klassifiziert werden.\n",
"\n",
"Das XOR-Problem ist ein klassisches Beispiel für die Grenzen des Perzeptrons und wurde 1969 von Marvin Minsky und Seymour Papert in ihrem Buch [Perceptrons](https://en.wikipedia.org/wiki/Perceptrons_(book)) aufgezeigt. Diese Beobachtung bremste die Forschung im Bereich der neuronalen Netze fast ein Jahrzehnt lang, obwohl - wie wir im nächsten Abschnitt unseres Kurses sehen werden - mehrschichtige Perzeptrons solche Probleme problemlos lösen können.\n",
"Das XOR-Problem ist ein klassisches Beispiel für die Grenzen des Perzeptrons und wurde 1969 von Marvin Minsky und Seymour Papert in ihrem Buch [Perceptrons](https://en.wikipedia.org/wiki/Perceptrons_(book)) aufgezeigt. Diese Beobachtung schränkte die Forschung im Bereich der neuronalen Netze für fast 10 Jahre ein, obwohl und das werden wir im nächsten Abschnitt unseres Kurses sehen mehrschichtige Perzeptrons solche Probleme problemlos lösen können.\n",
"\n",
"## Komplexes Beispiel - MNIST\n",
"\n",
"Auch wenn ein Perzeptron das XOR-Problem nicht lösen kann, ist es in der Lage, viele komplexere Probleme zu bewältigen, wie zum Beispiel die Erkennung handgeschriebener Zeichen.\n",
"\n",
"Ein Datensatz, der häufig beim Erlernen von maschinellem Lernen verwendet wird, heißt [MNIST](https://en.wikipedia.org/wiki/MNIST_database). Er wurde vom Modified National Institute of Standards and Technology erstellt und enthält einen Trainingsdatensatz mit 60.000 handgeschriebenen Ziffern, die von etwa 250 Studierenden und Mitarbeitenden des Instituts gesammelt wurden. Zusätzlich gibt es einen Testdatensatz mit 10.000 Ziffern, die von anderen Personen stammen.\n",
"Ein Datensatz, der häufig beim Erlernen von maschinellem Lernen verwendet wird, heißt [MNIST](https://en.wikipedia.org/wiki/MNIST_database). Er wurde vom Modified National Institute of Standards and Technology erstellt und enthält einen Trainingssatz mit 60.000 handgeschriebenen Ziffern, die von etwa 250 Studenten und Mitarbeitern des Instituts gesammelt wurden. Es gibt auch einen Testdatensatz mit 10.000 Ziffern, die von verschiedenen Personen stammen.\n",
"\n",
"Alle Ziffern werden durch Graustufenbilder mit einer Größe von 28x28 Pixeln dargestellt.\n",
"\n",
"> Der MNIST-Datensatz ist als Trainingswettbewerb auf [Kaggle](https://www.kaggle.com/c/digit-recognizer) verfügbar, einer Plattform, die Wettbewerbe und Herausforderungen im Bereich maschinelles Lernen ausrichtet. Sobald Sie gelernt haben, wie man MNIST-Ziffern klassifiziert, können Sie Ihre Lösung bei Kaggle einreichen, um zu sehen, wie sie im Vergleich zu anderen Teilnehmenden bewertet wird.\n",
"> Der MNIST-Datensatz ist als Trainingswettbewerb auf [Kaggle](https://www.kaggle.com/c/digit-recognizer) verfügbar, einer Plattform, die Wettbewerbe und Herausforderungen im Bereich maschinelles Lernen veranstaltet. Sobald Sie gelernt haben, wie man MNIST-Ziffern klassifiziert, können Sie Ihre Lösung bei Kaggle einreichen, um zu sehen, wie sie im Vergleich zu anderen Teilnehmern bewertet wird.\n",
"\n",
"Wir beginnen mit dem Laden des MNIST-Datensatzes:\n"
]
@ -693,7 +695,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Da der Perzeptron ein binärer Klassifikator ist, werden wir unser Problem darauf beschränken, nur zwei Ziffern zu erkennen. Die folgende Funktion wird positive und negative Beispielarrays mit zwei gegebenen Ziffern füllen (und auch Beispiele dieser Ziffern zur Verdeutlichung anzeigen).\n"
"Da der Perzeptron ein binärer Klassifikator ist, werden wir unser Problem darauf beschränken, nur zwei Ziffern zu erkennen. Die folgende Funktion wird positive und negative Beispielarrays mit zwei gegebenen Ziffern füllen (und zur Verdeutlichung auch Beispiele dieser Ziffern anzeigen).\n"
]
},
{
@ -829,11 +831,11 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Bitte beachten Sie, wie die Genauigkeit sehr schnell auf fast 100 % ansteigt.\n",
"Bitte beachten Sie, wie die Genauigkeit sehr schnell fast 100 % erreicht.\n",
"\n",
"Bitte schieben Sie den Regler an eine Position gegen Ende des Trainings und beobachten Sie die Gewichtsmatrix, die auf der linken Seite dargestellt wird. Diese Matrix hilft Ihnen zu verstehen, wie der Perzeptron tatsächlich funktioniert. Sie können die hohen Gewichtswerte in der Mitte des Feldes sehen, die den Pixeln entsprechen, die typischerweise für die Ziffer 1 vorhanden sind, und niedrige negative Werte an den Seiten, wo Teile der Ziffer 0 liegen. Wenn die dem Perzeptron präsentierte Ziffer tatsächlich eine 1 ist, wird der mittlere Teil mit hohen Werten multipliziert, was ein positives Ergebnis erzeugt. Im Gegensatz dazu werden bei der Beobachtung einer 0 die entsprechenden Pixel mit negativen Zahlen multipliziert.\n",
"Bitte bewegen Sie den Schieberegler zu einer Position gegen Ende des Trainings und beobachten Sie die Gewichtsmatrix, die links dargestellt wird. Diese Matrix hilft Ihnen zu verstehen, wie ein Perzeptron tatsächlich funktioniert. Sie können die hohen Gewichtswerte in der Mitte des Feldes sehen, die den Pixeln entsprechen, die typischerweise für die Ziffer 1 vorhanden sind, sowie die niedrigen negativen Werte an den Seiten, wo Teile der Ziffer 0 liegen. Wenn die dem Perzeptron präsentierte Ziffer tatsächlich eine 1 ist, wird der mittlere Teil mit hohen Werten multipliziert, was ein positives Ergebnis erzeugt. Im Gegensatz dazu werden bei der Beobachtung einer 0 die entsprechenden Pixel mit negativen Zahlen multipliziert.\n",
"\n",
"> Sie könnten bemerken, dass, wenn wir unserem Perzeptron eine Ziffer 1 geben, die leicht horizontal verschoben ist, sodass ihre Pixel den Platz einnehmen, wo sich vertikale Teile der 0 befinden, wir ein falsches Ergebnis erhalten könnten. Da die Natur unseres MNIST-Datensatzes so ist, dass alle Ziffern zentriert und korrekt positioniert sind, verlässt sich der Perzeptron darauf, um zwischen den Ziffern zu unterscheiden.\n",
"> Sie könnten bemerken, dass, wenn wir unserem Perzeptron eine Ziffer 1 geben, die leicht horizontal verschoben ist, sodass ihre Pixel den Bereich einnehmen, in dem sich die vertikalen Teile der 0 befinden, wir ein falsches Ergebnis erhalten könnten. Dies liegt daran, dass unser MNIST-Datensatz so aufgebaut ist, dass alle Ziffern zentriert und korrekt positioniert sind, und das Perzeptron sich darauf verlässt, um zwischen den Ziffern zu unterscheiden.\n",
"\n",
"Probieren wir nun verschiedene Ziffern aus:\n"
]
@ -911,11 +913,11 @@
"source": [
"## Diskussion\n",
"\n",
"Aus irgendeinem Grund sind 2 und 5 nicht so leicht voneinander zu trennen. Obwohl wir eine relativ hohe Genauigkeit (über 85%) erreichen, können wir deutlich sehen, wie der Perzeptron irgendwann aufhört zu lernen.\n",
"Aus irgendeinem Grund sind 2 und 5 nicht so leicht voneinander zu trennen. Obwohl wir eine relativ hohe Genauigkeit (über 85 %) erreichen, können wir deutlich sehen, wie der Perzeptron irgendwann aufhört zu lernen.\n",
"\n",
"Um zu verstehen, warum das passiert, können wir versuchen, [Principal Component Analysis](https://en.wikipedia.org/wiki/Principal_component_analysis) (PCA) zu verwenden. Dies ist eine Machine-Learning-Technik, die dazu dient, die Dimensionalität des Eingabedatensatzes zu reduzieren, um die bestmögliche Trennbarkeit zwischen den Klassen zu erreichen.\n",
"Um zu verstehen, warum das passiert, können wir versuchen, [Hauptkomponentenanalyse](https://de.wikipedia.org/wiki/Hauptkomponentenanalyse) (PCA) zu verwenden. Dies ist eine Technik des maschinellen Lernens, die dazu dient, die Dimensionalität des Eingabedatensatzes zu reduzieren, um die bestmögliche Trennbarkeit zwischen den Klassen zu erreichen.\n",
"\n",
"In unserem Fall hat ein Eingabebild 784 Pixel (Eingabemerkmale), und wir möchten PCA verwenden, um die Anzahl der Parameter auf nur 2 zu reduzieren, sodass wir sie auf einem Diagramm darstellen können. Diese zwei Parameter wären eine lineare Kombination der ursprünglichen Merkmale, und wir können diesen Vorgang als eine \"Rotation\" unseres ursprünglichen 784-dimensionalen Raums betrachten, bei der wir dessen Projektion auf unseren 2D-Raum beobachten, bis wir die beste Ansicht erhalten, die die Klassen trennt.\n"
"In unserem Fall hat ein Eingabebild 784 Pixel (Eingabemerkmale), und wir möchten PCA verwenden, um die Anzahl der Parameter auf nur 2 zu reduzieren, damit wir sie auf einem Diagramm darstellen können. Diese zwei Parameter wären eine lineare Kombination der ursprünglichen Merkmale, und wir können diesen Vorgang als eine \"Rotation\" unseres ursprünglichen 784-dimensionalen Raums betrachten, bei der wir dessen Projektion auf unseren 2D-Raum beobachten, bis wir die beste Ansicht erhalten, die die Klassen trennt.\n"
]
},
{
@ -1025,14 +1027,14 @@
}
},
"source": [
"Wie Sie sehen können, können 0 und 1 klar durch eine gerade Linie getrennt werden. Dies zeigt, dass im ursprünglichen 784-dimensionalen Raum die Punkte, die den Ziffern entsprechen, ebenfalls linear trennbar sind. Im Fall von 2 und 5 können wir keine geeignete Projektion finden, die die Ziffern klar trennt, und daher gibt es einige Fälle von falscher Klassifikation.\n",
"Wie Sie sehen können, können 0 und 1 klar durch eine gerade Linie getrennt werden. Dies zeigt, dass die Punkte, die den Ziffern im ursprünglichen 784-dimensionalen Raum entsprechen, ebenfalls linear trennbar sind. Im Fall von 2 und 5 können wir jedoch keine geeignete Projektion finden, die die Ziffern klar trennt, und daher gibt es einige Fälle von falscher Klassifikation.\n",
"\n",
"> Später in diesem Kurs werden wir lernen, wie man nicht-lineare Klassifikatoren mit neuronalen Netzwerken erstellt und wie man das Problem von Ziffern angeht, die nicht richtig ausgerichtet sind. Sehr bald werden wir eine Genauigkeit von über 99 % bei der MNIST-Ziffernklassifikation erreichen, während wir sie in 10 verschiedene Klassen einteilen.\n",
"> Später in diesem Kurs werden wir lernen, wie man nicht-lineare Klassifikatoren mit neuronalen Netzwerken erstellt und wie man das Problem von Ziffern angeht, die nicht richtig ausgerichtet sind. Sehr bald werden wir eine Genauigkeit von über 99 % bei der Klassifikation von MNIST-Ziffern erreichen, während wir sie in 10 verschiedene Klassen einteilen.\n",
"\n",
"## Erkenntnisse\n",
"## Fazit\n",
"\n",
" * Wir haben die einfachste Architektur eines neuronalen Netzwerks kennengelernt den Ein-Schicht-Perzeptron.\n",
" * Wir haben den Perzeptron \"von Hand\" implementiert, mit einem einfachen Trainingsverfahren basierend auf Gradientenabstieg.\n",
" * Wir haben den Perzeptron „von Hand“ implementiert, mit einem einfachen Trainingsverfahren basierend auf Gradientenabstieg.\n",
" * Trotz seiner Einfachheit kann der Ein-Schicht-Perzeptron recht komplexe Probleme der handschriftlichen Ziffernerkennung lösen.\n",
" * Der Ein-Schicht-Perzeptron ist ein linearer Klassifikator und bietet daher die gleiche Klassifikationsleistung wie die logistische Regression.\n",
" * Im Merkmalsraum kann der Perzeptron zwei Klassen von Eingabedaten mithilfe einer Hyperebene trennen.\n"
@ -1044,7 +1046,7 @@
"source": [
"## Credits\n",
"\n",
"Dieses Notebook ist Teil des [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners) und wurde von [Dmitry Soshnikov](http://soshnikov.com) erstellt. Es ist inspiriert von dem Neural Network Workshop bei Microsoft Research Cambridge. Einige Codebeispiele und illustratives Material stammen aus Präsentationen von [Katja Hoffmann](https://www.microsoft.com/en-us/research/people/kahofman/), [Matthew Johnson](https://www.microsoft.com/en-us/research/people/matjoh/) und [Ryoto Tomioka](https://www.microsoft.com/en-us/research/people/ryoto/), sowie aus dem [NeuroWorkshop](http://github.com/shwars/NeuroWorkshop)-Repository.\n"
"Dieses Notebook ist Teil des [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners) und wurde von [Dmitry Soshnikov](http://soshnikov.com) erstellt. Es ist inspiriert vom Neural Network Workshop bei Microsoft Research Cambridge. Einige Code- und Illustrationsmaterialien stammen aus Präsentationen von [Katja Hoffmann](https://www.microsoft.com/en-us/research/people/kahofman/), [Matthew Johnson](https://www.microsoft.com/en-us/research/people/matjoh/) und [Ryoto Tomioka](https://www.microsoft.com/en-us/research/people/ryoto/), sowie aus dem Repository [NeuroWorkshop](http://github.com/shwars/NeuroWorkshop).\n"
]
},
{
@ -1080,8 +1082,8 @@
"start_slideshow_at": "selected"
},
"coopTranslator": {
"original_hash": "914fc55f59efc7e17b8130d4033ac617",
"translation_date": "2025-08-31T16:33:28+00:00",
"original_hash": "d67e5b54ba20b507aa88d71aa3d042d8",
"translation_date": "2025-10-03T13:05:58+00:00",
"source_file": "lessons/3-NeuralNetworks/03-Perceptron/Perceptron.ipynb",
"language_code": "de"
}

View File

@ -9,13 +9,13 @@
}
},
"source": [
"## Perceptron\n",
"## Πεσέπτρον\n",
"\n",
"> Αυτό το σημειωματάριο αποτελεί μέρος του [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners). Επισκεφθείτε το αποθετήριο για το πλήρες σύνολο εκπαιδευτικού υλικού.\n",
"\n",
"Όπως έχουμε συζητήσει, το perceptron σας επιτρέπει να λύσετε το πρόβλημα της **δυαδικής ταξινόμησης**, δηλαδή να ταξινομήσετε παραδείγματα εισόδου σε δύο κατηγορίες - μπορούμε να τις ονομάσουμε **θετική** και **αρνητική**.\n",
"Όπως έχουμε συζητήσει, το πεσέπτρον σας επιτρέπει να λύσετε το πρόβλημα της **δυαδικής ταξινόμησης**, δηλαδή να ταξινομήσετε παραδείγματα εισόδου σε δύο κατηγορίες - μπορούμε να τις ονομάσουμε **θετική** και **αρνητική**.\n",
"\n",
"Αρχικά, ας εισάγουμε κάποιες απαραίτητες βιβλιοθήκες.\n"
"Πρώτα, ας εισάγουμε κάποιες απαραίτητες βιβλιοθήκες.\n"
]
},
{
@ -47,7 +47,7 @@
}
},
"source": [
"## Πρόβλημα Παιχνιδιού\n",
"## Απλό Πρόβλημα\n",
"\n",
"Για αρχή, ας ξεκινήσουμε με ένα απλό πρόβλημα, όπου έχουμε δύο χαρακτηριστικά εισόδου. Για παράδειγμα, στην ιατρική μπορεί να θέλουμε να ταξινομήσουμε όγκους σε καλοήθεις και κακοήθεις, ανάλογα με το μέγεθος και την ηλικία τους.\n",
"\n",
@ -152,9 +152,9 @@
}
},
"source": [
"## Αντιληπτήριο\n",
"## Perceptron\n",
"\n",
"Δεδομένου ότι το αντιληπτήριο είναι ένας δυαδικός ταξινομητής, για κάθε διανυσματική είσοδο $x$, η έξοδος του αντιληπτηρίου μας θα είναι είτε +1 είτε -1, ανάλογα με την κατηγορία. Η έξοδος θα υπολογίζεται χρησιμοποιώντας τον τύπο\n",
"Δεδομένου ότι το perceptron είναι ένας δυαδικός ταξινομητής, για κάθε διανυσματική είσοδο $x$, η έξοδος του perceptron μας θα είναι είτε +1 είτε -1, ανάλογα με την κατηγορία. Η έξοδος θα υπολογιστεί χρησιμοποιώντας τον τύπο\n",
"\n",
"$$y(\\mathbf{x}) = f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x})$$\n",
"\n",
@ -166,7 +166,7 @@
" \\end{cases} \\\\\n",
"$$\n",
"\n",
"Ωστόσο, ένα γενικό γραμμικό μοντέλο θα πρέπει επίσης να περιλαμβάνει μια προκατάληψη (bias), δηλαδή ιδανικά θα πρέπει να υπολογίζουμε το $y$ ως $y=f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}+\\mathbf{b})$. Για να απλοποιήσουμε το μοντέλο μας, μπορούμε να απαλλαγούμε από αυτόν τον όρο προκατάληψης προσθέτοντας μία ακόμη διάσταση στις χαρακτηριστικές εισόδους μας, η οποία θα είναι πάντα ίση με 1:\n"
"Ωστόσο, ένα γενικό γραμμικό μοντέλο θα πρέπει επίσης να έχει μια προκατάληψη (bias), δηλαδή ιδανικά θα πρέπει να υπολογίζουμε το $y$ ως $y=f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}+\\mathbf{b})$. Για να απλοποιήσουμε το μοντέλο μας, μπορούμε να απαλλαγούμε από αυτόν τον όρο προκατάληψης προσθέτοντας μία ακόμη διάσταση στις χαρακτηριστικές εισόδους μας, η οποία θα είναι πάντα ίση με 1:\n"
]
},
{
@ -206,12 +206,12 @@
"source": [
"## Αλγόριθμος Εκπαίδευσης\n",
"\n",
"Για να εκπαιδεύσουμε τον perceptron, πρέπει να βρούμε τα βάρη $\\mathbf{w}$ που θα ελαχιστοποιήσουν το σφάλμα. Το σφάλμα ορίζεται χρησιμοποιώντας το **κριτήριο του perceptron**:\n",
"Για να εκπαιδεύσουμε το perceptron, πρέπει να βρούμε τα βάρη $\\mathbf{w}$ που θα ελαχιστοποιήσουν το σφάλμα. Το σφάλμα ορίζεται χρησιμοποιώντας το **κριτήριο του perceptron**:\n",
"\n",
"$$E(\\mathbf{w}) = -\\sum_{n \\in \\mathcal{M}}\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}_{n}t_{n}$$\n",
" \n",
" * $t_{n} \\in \\{-1, +1\\}$ για αρνητικά και θετικά δείγματα εκπαίδευσης, αντίστοιχα\n",
" * $\\mathcal{M}$ - το σύνολο των λανθασμένα ταξινομημένων παραδειγμάτων\n",
" * $\\mathcal{M}$ - ένα σύνολο παραδειγμάτων που ταξινομήθηκαν λανθασμένα\n",
" \n",
"Θα χρησιμοποιήσουμε τη διαδικασία της **κατάβασης κλίσης**. Ξεκινώντας με κάποια αρχικά τυχαία βάρη $\\mathbf{w}^{(0)}$, θα προσαρμόζουμε τα βάρη σε κάθε βήμα της εκπαίδευσης χρησιμοποιώντας την κλίση του $E$:\n",
"\n",
@ -271,7 +271,9 @@
{
"cell_type": "markdown",
"metadata": {},
"source": []
"source": [
"Τώρα ας εκτελέσουμε την εκπαίδευση στο σύνολο δεδομένων μας:\n"
]
},
{
"cell_type": "code",
@ -311,7 +313,7 @@
"source": [
"Όπως μπορείτε να δείτε, η αρχική ακρίβεια είναι περίπου 50%, αλλά αυξάνεται γρήγορα σε υψηλότερες τιμές κοντά στο 90%.\n",
"\n",
"Ας οπτικοποιήσουμε πώς διαχωρίζονται οι κλάσεις. Η συνάρτηση ταξινόμησης μας έχει τη μορφή $\\mathbf{w}^Tx$, και είναι μεγαλύτερη από 0 για μία κλάση, ενώ είναι μικρότερη από 0 για την άλλη. Επομένως, η γραμμή διαχωρισμού των κλάσεων ορίζεται από $\\mathbf{w}^Tx = 0$. Επειδή έχουμε μόνο δύο διαστάσεις $x_0$ και $x_1$, η εξίσωση για τη γραμμή θα είναι $w_0x_0+w_1x_1+w_2 = 0$ (θυμηθείτε ότι έχουμε ορίσει ρητά μια επιπλέον διάσταση $x_2=1$). Ας σχεδιάσουμε αυτή τη γραμμή:\n"
"Ας οπτικοποιήσουμε πώς διαχωρίζονται οι κατηγορίες. Η συνάρτηση ταξινόμησης μας έχει τη μορφή $\\mathbf{w}^Tx$, και είναι μεγαλύτερη από 0 για μία κατηγορία, ενώ είναι μικρότερη από 0 για την άλλη. Επομένως, η γραμμή διαχωρισμού των κατηγοριών ορίζεται από $\\mathbf{w}^Tx = 0$. Επειδή έχουμε μόνο δύο διαστάσεις $x_0$ και $x_1$, η εξίσωση για τη γραμμή θα είναι $w_0x_0+w_1x_1+w_2 = 0$ (θυμηθείτε ότι έχουμε ορίσει ρητά μια επιπλέον διάσταση $x_2=1$). Ας σχεδιάσουμε αυτή τη γραμμή:\n"
]
},
{
@ -377,9 +379,9 @@
}
},
"source": [
"## Αξιολόγηση στο Σύνολο Δεδομένων Δοκιμής\n",
"## Αξιολόγηση στο Σύνολο Δοκιμών\n",
"\n",
"Στην αρχή, έχουμε κρατήσει κάποια δεδομένα για το σύνολο δεδομένων δοκιμής. Ας δούμε πόσο ακριβής είναι ο ταξινομητής μας σε αυτό το σύνολο δεδομένων δοκιμής. Για να το κάνουμε αυτό, επεκτείνουμε επίσης το σύνολο δεδομένων δοκιμής με μια επιπλέον διάσταση, πολλαπλασιάζουμε με τον πίνακα βαρών και βεβαιωνόμαστε ότι η τιμή που προκύπτει έχει το ίδιο πρόσημο με την ετικέτα (+1 ή -1). Στη συνέχεια, προσθέτουμε όλες τις λογικές τιμές και διαιρούμε με το μήκος του δείγματος δοκιμής, για να υπολογίσουμε την ακρίβεια:\n"
"Στην αρχή, έχουμε κρατήσει κάποια δεδομένα για το σύνολο δοκιμών. Ας δούμε πόσο ακριβής είναι ο ταξινομητής μας σε αυτό το σύνολο δοκιμών. Για να το κάνουμε αυτό, επεκτείνουμε το σύνολο δοκιμών με μια επιπλέον διάσταση, πολλαπλασιάζουμε με τον πίνακα βαρών και βεβαιωνόμαστε ότι η τιμή που προκύπτει έχει το ίδιο πρόσημο με την ετικέτα (+1 ή -1). Στη συνέχεια, προσθέτουμε όλες τις λογικές τιμές και διαιρούμε με το μήκος του δείγματος δοκιμών, για να υπολογίσουμε την ακρίβεια:\n"
]
},
{
@ -420,7 +422,7 @@
"source": [
"## Παρακολούθηση της διαδικασίας εκπαίδευσης\n",
"\n",
"Έχουμε δει προηγουμένως πώς η ακρίβεια μειώνεται κατά τη διάρκεια της εκπαίδευσης. Θα ήταν ενδιαφέρον να δούμε πώς συμπεριφέρεται η γραμμή διαχωρισμού κατά τη διάρκεια της εκπαίδευσης. Ο παρακάτω κώδικας θα οπτικοποιήσει τα πάντα σε ένα γράφημα, και θα μπορείτε να μετακινήσετε τον δείκτη για να \"ταξιδέψετε στον χρόνο\" μέσα στη διαδικασία εκπαίδευσης.\n"
"Έχουμε δει προηγουμένως πώς μειώνεται η ακρίβεια κατά τη διάρκεια της εκπαίδευσης. Θα ήταν ενδιαφέρον να δούμε πώς συμπεριφέρεται η γραμμή διαχωρισμού κατά τη διάρκεια της εκπαίδευσης. Ο παρακάτω κώδικας θα οπτικοποιήσει τα πάντα σε ένα γράφημα, και θα μπορείτε να μετακινήσετε τον δείκτη για να \"ταξιδέψετε στον χρόνο\" μέσα στη διαδικασία εκπαίδευσης.\n"
]
},
{
@ -527,7 +529,7 @@
"source": [
"## Περιορισμοί του Perceptron\n",
"\n",
"Όπως είδατε παραπάνω, το perceptron είναι ένας **γραμμικός ταξινομητής**. Μπορεί να διακρίνει καλά μεταξύ δύο κατηγοριών αν αυτές είναι **γραμμικά διαχωρίσιμες**, δηλαδή αν μπορούν να διαχωριστούν με μια ευθεία γραμμή. Διαφορετικά, η διαδικασία εκπαίδευσης του perceptron δεν θα συγκλίνει.\n",
"Όπως είδατε παραπάνω, το perceptron είναι ένας **γραμμικός ταξινομητής**. Μπορεί να διακρίνει καλά μεταξύ δύο κατηγοριών αν είναι **γραμμικά διαχωρίσιμες**, δηλαδή αν μπορούν να διαχωριστούν με μια ευθεία γραμμή. Σε διαφορετική περίπτωση, η διαδικασία εκπαίδευσης του perceptron δεν θα συγκλίνει.\n",
"\n",
"Ένα από τα πιο προφανή παραδείγματα προβλήματος που δεν μπορεί να λυθεί από ένα perceptron είναι το λεγόμενο **πρόβλημα XOR**. Θέλουμε το perceptron μας να μάθει τη λογική συνάρτηση XOR, η οποία έχει τον εξής πίνακα αληθείας:\n",
"\n",
@ -536,7 +538,7 @@
"| 0 | 0 | 1 | \n",
"| 1 | 1 | 0 |\n",
"\n",
"Ας προσπαθήσουμε να το κάνουμε αυτό! Θα συμπληρώσουμε χειροκίνητα όλα τα θετικά και αρνητικά δείγματα εκπαίδευσης και στη συνέχεια θα καλέσουμε τη συνάρτηση train που ορίσαμε παραπάνω:\n"
"Ας προσπαθήσουμε να το κάνουμε! Θα γεμίσουμε χειροκίνητα όλα τα θετικά και αρνητικά δείγματα εκπαίδευσης και στη συνέχεια θα καλέσουμε τη συνάρτηση εκπαίδευσης που ορίσαμε παραπάνω:\n"
]
},
{
@ -603,19 +605,19 @@
}
},
"source": [
"Όπως μπορείτε να δείτε από το παραπάνω γράφημα, η ακρίβεια δεν ξεπερνά ποτέ το 75%, επειδή είναι αδύνατο να σχεδιάσετε μια ευθεία γραμμή με τέτοιο τρόπο ώστε να καλύπτονται όλα τα πιθανά παραδείγματα σωστά.\n",
"Όπως μπορείτε να δείτε από το παραπάνω γράφημα, η ακρίβεια δεν ξεπερνά ποτέ το 75%, επειδή είναι αδύνατο να σχεδιάσετε μια ευθεία γραμμή με τέτοιο τρόπο ώστε να καλύπτονται σωστά όλα τα παραδείγματα.\n",
"\n",
"Το πρόβλημα XOR είναι ένα κλασικό παράδειγμα περιορισμών του perceptron, και επισημάνθηκε από τους Marvin Minsky και Seymour Papert το 1969 στο βιβλίο τους [Perceptrons](https://en.wikipedia.org/wiki/Perceptrons_(book)). Αυτή η παρατήρηση περιόρισε την έρευνα στον τομέα των νευρωνικών δικτύων για σχεδόν 10 χρόνια, παρόλο που - και θα το δούμε αυτό στην επόμενη ενότητα του μαθήματός μας - τα πολυεπίπεδα perceptrons είναι απολύτως ικανά να λύσουν τέτοια προβλήματα.\n",
"Το πρόβλημα XOR είναι ένα κλασικό παράδειγμα των περιορισμών του perceptron, και επισημάνθηκε από τους Marvin Minsky και Seymour Papert το 1969 στο βιβλίο τους [Perceptrons](https://en.wikipedia.org/wiki/Perceptrons_(book)). Αυτή η παρατήρηση περιόρισε την έρευνα στον τομέα των νευρωνικών δικτύων για σχεδόν 10 χρόνια, παρόλο που - και θα το δούμε στην επόμενη ενότητα του μαθήματός μας - τα perceptrons με πολλαπλά επίπεδα είναι απολύτως ικανά να λύσουν τέτοια προβλήματα.\n",
"\n",
"## Σύνθετο Παράδειγμα - MNIST\n",
"\n",
"Παρόλο που το perceptron δεν μπορεί να λύσει το πρόβλημα XOR, μπορεί να λύσει πολλά πιο σύνθετα προβλήματα, όπως η αναγνώριση χειρόγραφων χαρακτήρων.\n",
"\n",
"Ένα σύνολο δεδομένων που χρησιμοποιείται συχνά για την εκμάθηση της μηχανικής μάθησης ονομάζεται [MNIST](https://en.wikipedia.org/wiki/MNIST_database). Δημιουργήθηκε από το Τροποποιημένο Εθνικό Ινστιτούτο Προτύπων και Τεχνολογίας και περιέχει ένα σύνολο εκπαίδευσης με 60000 χειρόγραφους αριθμούς, που συλλέχθηκαν από περίπου 250 μαθητές και υπαλλήλους του ινστιτούτου. Υπάρχει επίσης ένα σύνολο δοκιμών με 10000 αριθμούς, που συλλέχθηκαν από διαφορετικά άτομα.\n",
"Ένα σύνολο δεδομένων που χρησιμοποιείται συχνά για την εκμάθηση της μηχανικής μάθησης ονομάζεται [MNIST](https://en.wikipedia.org/wiki/MNIST_database). Δημιουργήθηκε από το Modified National Institute of Standards and Technology και περιέχει ένα σύνολο εκπαίδευσης με 60.000 χειρόγραφους αριθμούς, που συλλέχθηκαν από περίπου 250 μαθητές και υπαλλήλους του ινστιτούτου. Υπάρχει επίσης ένα σύνολο δοκιμών με 10.000 αριθμούς, που συλλέχθηκαν από διαφορετικά άτομα.\n",
"\n",
"Όλοι οι αριθμοί αναπαρίστανται από εικόνες σε κλίμακα του γκρι μεγέθους 28x28 pixels.\n",
"Όλοι οι αριθμοί αναπαρίστανται από εικόνες σε κλίμακα του γκρι, μεγέθους 28x28 pixels.\n",
"\n",
"> Το σύνολο δεδομένων MNIST είναι διαθέσιμο ως διαγωνισμός εκπαίδευσης στο [Kaggle](https://www.kaggle.com/c/digit-recognizer), έναν ιστότοπο που φιλοξενεί διαγωνισμούς και διαγωνισμούς μηχανικής μάθησης. Μόλις μάθετε πώς να ταξινομείτε τους αριθμούς MNIST, μπορείτε να υποβάλετε τη λύση σας στο Kaggle για να δείτε πώς αξιολογείται μεταξύ άλλων συμμετεχόντων.\n",
"> Το σύνολο δεδομένων MNIST είναι διαθέσιμο ως διαγωνισμός εκπαίδευσης στο [Kaggle](https://www.kaggle.com/c/digit-recognizer), έναν ιστότοπο που φιλοξενεί διαγωνισμούς και προκλήσεις μηχανικής μάθησης. Μόλις μάθετε πώς να ταξινομείτε τους αριθμούς του MNIST, μπορείτε να υποβάλετε τη λύση σας στο Kaggle για να δείτε πώς αξιολογείται σε σύγκριση με άλλους συμμετέχοντες.\n",
"\n",
"Ξεκινάμε φορτώνοντας το σύνολο δεδομένων MNIST:\n"
]
@ -693,7 +695,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Επειδή ο perceptron είναι ένας δυαδικός ταξινομητής, θα περιορίσουμε το πρόβλημά μας στην αναγνώριση μόνο δύο ψηφίων. Η παρακάτω συνάρτηση θα γεμίσει τους πίνακες θετικών και αρνητικών δειγμάτων με δύο δεδομένα ψηφία (και θα δείξει επίσης δείγματα αυτών των ψηφίων για σαφήνεια).\n"
"Επειδή ο perceptron είναι ένας δυαδικός ταξινομητής, θα περιορίσουμε το πρόβλημά μας στην αναγνώριση μόνο δύο ψηφίων. Η παρακάτω συνάρτηση θα γεμίσει τους πίνακες θετικών και αρνητικών δειγμάτων με δύο δεδομένα ψηφία (και θα δείξει επίσης δείγματα αυτών των ψηφίων για λόγους σαφήνειας).\n"
]
},
{
@ -829,11 +831,11 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Παρακαλώ σημειώστε πόσο γρήγορα η ακρίβεια φτάνει σχεδόν στο 100%.\n",
"Παρατηρήστε πώς η ακρίβεια ανεβαίνει σχεδόν στο 100% πολύ γρήγορα.\n",
"\n",
"Παρακαλώ, μετακινήστε τον ολισθητήρα σε κάποια θέση προς το τέλος της εκπαίδευσης και παρατηρήστε τον πίνακα βαρών που απεικονίζεται στα αριστερά. Αυτός ο πίνακας θα σας επιτρέψει να κατανοήσετε πώς λειτουργεί ο perceptron. Μπορείτε να δείτε τις υψηλές τιμές βαρών στο κέντρο του πεδίου, που αντιστοιχούν σε pixels που συνήθως υπάρχουν για το ψηφίο 1, και χαμηλές αρνητικές τιμές στις πλευρές, όπου βρίσκονται μέρη του ψηφίου 0. Έτσι, αν το ψηφίο που παρουσιάζεται στον perceptron είναι πράγματι το 1, το κεντρικό μέρος του θα πολλαπλασιαστεί με υψηλές τιμές, παράγοντας θετικό αποτέλεσμα. Αντίθετα, όταν ο perceptron παρατηρεί το 0, τα αντίστοιχα pixels θα πολλαπλασιαστούν με αρνητικούς αριθμούς.\n",
"Παρακαλώ, μετακινήστε τον ολισθητήρα σε κάποια θέση προς το τέλος της εκπαίδευσης και παρατηρήστε τον πίνακα βαρών που εμφανίζεται στα αριστερά. Αυτός ο πίνακας θα σας βοηθήσει να κατανοήσετε πώς λειτουργεί ο perceptron. Μπορείτε να δείτε τις υψηλές τιμές βαρών στο κέντρο του πεδίου, που αντιστοιχούν σε pixels που συνήθως υπάρχουν για το ψηφίο 1, και χαμηλές αρνητικές τιμές στις πλευρές, όπου βρίσκονται μέρη του ψηφίου 0. Έτσι, αν το ψηφίο που παρουσιάζεται στον perceptron είναι πράγματι το 1, το κεντρικό του μέρος θα πολλαπλασιαστεί με υψηλές τιμές, παράγοντας θετικό αποτέλεσμα. Αντίθετα, όταν ο perceptron παρατηρεί το 0, τα αντίστοιχα pixels θα πολλαπλασιαστούν με αρνητικούς αριθμούς.\n",
"\n",
"> Μπορεί να παρατηρήσετε ότι αν δώσουμε στον perceptron ένα ψηφίο 1 ελαφρώς μετατοπισμένο οριζόντια, έτσι ώστε τα pixels του να καταλαμβάνουν τη θέση όπου υπάρχουν κάθετα μέρη του 0, μπορεί να λάβουμε λανθασμένο αποτέλεσμα. Δεδομένου ότι η φύση του συνόλου δεδομένων MNIST είναι τέτοια που όλα τα ψηφία είναι κεντραρισμένα και τοποθετημένα σωστά, ο perceptron βασίζεται σε αυτό για να διακρίνει μεταξύ των ψηφίων.\n",
"> Μπορεί να παρατηρήσετε ότι αν δώσουμε στον perceptron ένα ψηφίο 1 ελαφρώς μετατοπισμένο οριζόντια, έτσι ώστε τα pixels του να καταλαμβάνουν τη θέση όπου υπάρχουν κάθετα μέρη του 0, μπορεί να λάβουμε λανθασμένο αποτέλεσμα. Αυτό συμβαίνει επειδή η φύση του συνόλου δεδομένων MNIST είναι τέτοια που όλα τα ψηφία είναι κεντραρισμένα και τοποθετημένα σωστά, και ο perceptron βασίζεται σε αυτό για να διακρίνει τα ψηφία.\n",
"\n",
"Τώρα ας δοκιμάσουμε διαφορετικά ψηφία:\n"
]
@ -911,11 +913,11 @@
"source": [
"## Συζήτηση\n",
"\n",
"Για κάποιο λόγο, το 2 και το 5 δεν διαχωρίζονται τόσο εύκολα. Παρόλο που πετυχαίνουμε σχετικά υψηλή ακρίβεια (πάνω από 85%), μπορούμε να δούμε ξεκάθαρα ότι ο perceptron σταματά να μαθαίνει σε κάποιο σημείο.\n",
"Για κάποιο λόγο, οι αριθμοί 2 και 5 δεν διαχωρίζονται τόσο εύκολα. Παρόλο που πετυχαίνουμε σχετικά υψηλή ακρίβεια (πάνω από 85%), μπορούμε να δούμε ξεκάθαρα ότι ο perceptron σταματά να μαθαίνει σε κάποιο σημείο.\n",
"\n",
"Για να κατανοήσουμε γιατί συμβαίνει αυτό, μπορούμε να χρησιμοποιήσουμε την [Ανάλυση Κύριων Συνιστωσών](https://en.wikipedia.org/wiki/Principal_component_analysis) (PCA). Πρόκειται για μια τεχνική μηχανικής μάθησης που χρησιμοποιείται για τη μείωση της διαστατικότητας του συνόλου δεδομένων εισόδου, με τέτοιο τρόπο ώστε να επιτευχθεί ο καλύτερος δυνατός διαχωρισμός μεταξύ των κατηγοριών.\n",
"Για να κατανοήσουμε γιατί συμβαίνει αυτό, μπορούμε να χρησιμοποιήσουμε την [Ανάλυση Κύριων Συνιστωσών](https://en.wikipedia.org/wiki/Principal_component_analysis) (PCA). Πρόκειται για μια τεχνική μηχανικής μάθησης που χρησιμοποιείται για τη μείωση της διαστασιμότητας του συνόλου δεδομένων εισόδου, με τέτοιο τρόπο ώστε να επιτευχθεί ο καλύτερος δυνατός διαχωρισμός μεταξύ των κατηγοριών.\n",
"\n",
"Στη δική μας περίπτωση, μια εικόνα εισόδου έχει 784 pixels (χαρακτηριστικά εισόδου), και θέλουμε να χρησιμοποιήσουμε το PCA για να μειώσουμε τον αριθμό των παραμέτρων σε μόλις 2, ώστε να μπορέσουμε να τις απεικονίσουμε σε γράφημα. Αυτές οι δύο παράμετροι θα είναι ένας γραμμικός συνδυασμός των αρχικών χαρακτηριστικών, και μπορούμε να δούμε αυτή τη διαδικασία ως \"περιστροφή\" του αρχικού μας χώρου 784 διαστάσεων και παρατήρηση της προβολής του στον δισδιάστατο χώρο, μέχρι να αποκτήσουμε την καλύτερη δυνατή όψη που διαχωρίζει τις κατηγορίες.\n"
"Στη δική μας περίπτωση, μια εικόνα εισόδου έχει 784 pixels (χαρακτηριστικά εισόδου), και θέλουμε να χρησιμοποιήσουμε την PCA για να μειώσουμε τον αριθμό των παραμέτρων σε μόλις 2, ώστε να μπορέσουμε να τις απεικονίσουμε σε ένα γράφημα. Αυτές οι δύο παράμετροι θα είναι ένας γραμμικός συνδυασμός των αρχικών χαρακτηριστικών, και μπορούμε να δούμε αυτή τη διαδικασία ως \"περιστροφή\" του αρχικού μας χώρου 784 διαστάσεων και παρατήρηση της προβολής του στον δισδιάστατο χώρο μας, μέχρι να πετύχουμε την καλύτερη δυνατή προβολή που διαχωρίζει τις κατηγορίες.\n"
]
},
{
@ -1025,33 +1027,33 @@
}
},
"source": [
"Όπως μπορείτε να δείτε, το 0 και το 1 μπορούν να διαχωριστούν καθαρά με μια ευθεία γραμμή. Αυτό υποδεικνύει ότι στον αρχικό 784-διάστατο χώρο, τα σημεία που αντιστοιχούν σε ψηφία είναι επίσης γραμμικά διαχωρίσιμα. Στην περίπτωση του 2 και του 5, δεν μπορούμε να βρούμε την κατάλληλη προβολή που θα διαχωρίσει τα ψηφία καθαρά, και έτσι υπάρχουν ορισμένες περιπτώσεις λανθασμένης ταξινόμησης.\n",
"Όπως μπορείτε να δείτε, το 0 και το 1 μπορούν να διαχωριστούν ξεκάθαρα με μια ευθεία γραμμή. Αυτό υποδεικνύει ότι στον αρχικό χώρο των 784 διαστάσεων, τα σημεία που αντιστοιχούν στα ψηφία είναι επίσης γραμμικά διαχωρίσιμα. Στην περίπτωση του 2 και του 5, δεν μπορούμε να βρούμε την κατάλληλη προβολή που θα διαχωρίσει τα ψηφία ξεκάθαρα, και έτσι υπάρχουν ορισμένες περιπτώσεις λανθασμένης ταξινόμησης.\n",
"\n",
"> Αργότερα σε αυτό το μάθημα θα μάθουμε πώς να δημιουργούμε μη γραμμικούς ταξινομητές χρησιμοποιώντας Νευρωνικά Δίκτυα, και πώς να αντιμετωπίζουμε το πρόβλημα των ψηφίων που δεν είναι σωστά ευθυγραμμισμένα. Πολύ σύντομα θα φτάσουμε σε ακρίβεια πάνω από 99% στην ταξινόμηση ψηφίων MNIST, ενώ θα τα ταξινομούμε σε 10 διαφορετικές κατηγορίες.\n",
"> Αργότερα σε αυτό το μάθημα θα μάθουμε πώς να δημιουργούμε μη γραμμικούς ταξινομητές χρησιμοποιώντας Νευρωνικά Δίκτυα, καθώς και πώς να αντιμετωπίζουμε το πρόβλημα των ψηφίων που δεν είναι σωστά ευθυγραμμισμένα. Πολύ σύντομα θα φτάσουμε σε ακρίβεια πάνω από 99% στην ταξινόμηση ψηφίων MNIST, ενώ θα τα ταξινομούμε σε 10 διαφορετικές κατηγορίες.\n",
"\n",
"## Συμπεράσματα\n",
"\n",
" * Μάθαμε για την απλούστερη αρχιτεκτονική νευρωνικού δικτύου - τον μονοστρωματικό perceptron.\n",
" * Υλοποιήσαμε τον perceptron \"χειροκίνητα\", χρησιμοποιώντας μια απλή διαδικασία εκπαίδευσης βασισμένη στην καθοδική κλίση.\n",
" * Παρά την απλότητα, ο μονοστρωματικός perceptron μπορεί να λύσει αρκετά σύνθετα προβλήματα αναγνώρισης χειρόγραφων ψηφίων.\n",
" * Ο μονοστρωματικός perceptron είναι ένας γραμμικός ταξινομητής, και επομένως παρέχει την ίδια ταξινομητική ισχύ όπως η λογιστική παλινδρόμηση.\n",
" * Στον χώρο των δειγμάτων, ο perceptron μπορεί να διαχωρίσει δύο κατηγορίες δεδομένων εισόδου χρησιμοποιώντας υπερεπίπεδο.\n"
" * Μάθαμε για την πιο απλή αρχιτεκτονική νευρωνικού δικτύου - τον μονοστρωματικό perceptron.\n",
" * Υλοποιήσαμε τον perceptron \"με το χέρι\", χρησιμοποιώντας μια απλή διαδικασία εκπαίδευσης βασισμένη στην κατάβαση κλίσης.\n",
" * Παρά την απλότητά του, ο μονοστρωματικός perceptron μπορεί να λύσει αρκετά σύνθετα προβλήματα αναγνώρισης χειρόγραφων ψηφίων.\n",
" * Ο μονοστρωματικός perceptron είναι ένας γραμμικός ταξινομητής, και συνεπώς παρέχει την ίδια ταξινομητική ισχύ με την λογιστική παλινδρόμηση.\n",
" * Στον χώρο των δειγμάτων, ο perceptron μπορεί να διαχωρίσει δύο κατηγορίες δεδομένων εισόδου χρησιμοποιώντας ένα υπερεπίπεδο.\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Συντελεστές\n",
"## Πιστώσεις\n",
"\n",
"Αυτό το σημειωματάριο αποτελεί μέρος του [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners) και έχει προετοιμαστεί από τον [Dmitry Soshnikov](http://soshnikov.com). Είναι εμπνευσμένο από το Neural Network Workshop στο Microsoft Research Cambridge. Κάποιος κώδικας και υλικό για επεξήγηση έχουν ληφθεί από παρουσιάσεις των [Katja Hoffmann](https://www.microsoft.com/en-us/research/people/kahofman/), [Matthew Johnson](https://www.microsoft.com/en-us/research/people/matjoh/) και [Ryoto Tomioka](https://www.microsoft.com/en-us/research/people/ryoto/), καθώς και από το αποθετήριο [NeuroWorkshop](http://github.com/shwars/NeuroWorkshop).\n"
"Αυτό το σημειωματάριο αποτελεί μέρος του [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners) και έχει προετοιμαστεί από τον [Dmitry Soshnikov](http://soshnikov.com). Είναι εμπνευσμένο από το Neural Network Workshop στο Microsoft Research Cambridge. Κάποιος κώδικας και υλικό απεικόνισης έχουν ληφθεί από παρουσιάσεις των [Katja Hoffmann](https://www.microsoft.com/en-us/research/people/kahofman/), [Matthew Johnson](https://www.microsoft.com/en-us/research/people/matjoh/) και [Ryoto Tomioka](https://www.microsoft.com/en-us/research/people/ryoto/), καθώς και από το αποθετήριο [NeuroWorkshop](http://github.com/shwars/NeuroWorkshop).\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Αποποίηση Ευθύνης**: \nΑυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης [Co-op Translator](https://github.com/Azure/co-op-translator). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτόματες μεταφράσεις ενδέχεται να περιέχουν σφάλματα ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης.\n"
"\n---\n\n**Αποποίηση ευθύνης**: \nΑυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης [Co-op Translator](https://github.com/Azure/co-op-translator). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτόματες μεταφράσεις ενδέχεται να περιέχουν λάθη ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης.\n"
]
}
],
@ -1080,8 +1082,8 @@
"start_slideshow_at": "selected"
},
"coopTranslator": {
"original_hash": "914fc55f59efc7e17b8130d4033ac617",
"translation_date": "2025-08-29T10:22:31+00:00",
"original_hash": "d67e5b54ba20b507aa88d71aa3d042d8",
"translation_date": "2025-10-03T13:27:25+00:00",
"source_file": "lessons/3-NeuralNetworks/03-Perceptron/Perceptron.ipynb",
"language_code": "el"
}

View File

@ -13,7 +13,7 @@
"\n",
"> This notebook is part of [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners). Visit the repository for the complete set of learning materials.\n",
"\n",
"As we discussed, a perceptron allows you to solve a **binary classification problem**, meaning it classifies input examples into two categories - which we can call **positive** and **negative**.\n",
"As we discussed, a perceptron helps solve **binary classification problems**, meaning it classifies input examples into two categories—let's call them **positive** and **negative**.\n",
"\n",
"First, let's import some necessary libraries.\n"
]
@ -49,7 +49,7 @@
"source": [
"## Toy Problem\n",
"\n",
"To start, let's work on a simple problem with two input features. For instance, in medicine, we might want to classify tumors as benign or malignant based on their size and age.\n",
"To start, let's consider a simple example with two input features. For instance, in medicine, we might want to classify tumors as benign or malignant based on their size and age.\n",
"\n",
"We'll create a random classification dataset using the `make_classification` function from the SciKit Learn library:\n"
]
@ -154,7 +154,7 @@
"source": [
"## Perceptron\n",
"\n",
"Since the perceptron is a binary classifier, for each input vector $x$, the output of our perceptron will be either +1 or -1, depending on the class. The output is calculated using the formula\n",
"Since the perceptron is a binary classifier, for each input vector $x$, the output of our perceptron will be either +1 or -1, depending on the class. The output is calculated using the formula:\n",
"\n",
"$$y(\\mathbf{x}) = f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x})$$\n",
"\n",
@ -166,7 +166,7 @@
" \\end{cases} \\\\\n",
"$$\n",
"\n",
"However, a general linear model should also include a bias term, meaning that ideally, we would compute $y$ as $y=f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}+\\mathbf{b})$. To simplify our model, we can eliminate this bias term by adding an additional dimension to our input features, which is always equal to 1:\n"
"However, a general linear model should also include a bias term, meaning that ideally, we should compute $y$ as $y=f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}+\\mathbf{b})$. To simplify our model, we can eliminate this bias term by adding an additional dimension to our input features, which is always equal to 1:\n"
]
},
{
@ -213,11 +213,11 @@
" * $t_{n} \\in \\{-1, +1\\}$ for negative and positive training samples, respectively\n",
" * $\\mathcal{M}$ - the set of misclassified examples\n",
" \n",
"We will use the **gradient descent** method. Starting with some initial random weights $\\mathbf{w}^{(0)}$, we will update the weights at each step of training using the gradient of $E$:\n",
"We will use the **gradient descent** method. Starting with some initial random weights $\\mathbf{w}^{(0)}$, we will update the weights at each step of the training process using the gradient of $E$:\n",
"\n",
"$$\\mathbf{w}^{\\tau + 1}=\\mathbf{w}^{\\tau} - \\eta \\nabla E(\\mathbf{w}) = \\mathbf{w}^{\\tau} + \\eta\\sum_{n \\in \\mathcal{M}}\\mathbf{x}_{n} t_{n}$$\n",
"\n",
"where $\\eta$ is the **learning rate**, and $\\tau\\in\\mathbb{N}$ is the iteration number.\n",
"where $\\eta$ is the **learning rate**, and $\\tau\\in\\mathbb{N}$ represents the iteration number.\n",
"\n",
"Let's implement this algorithm in Python:\n"
]
@ -271,7 +271,9 @@
{
"cell_type": "markdown",
"metadata": {},
"source": []
"source": [
"Now let's run the training on our dataset:\n"
]
},
{
"cell_type": "code",
@ -309,9 +311,9 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"As you can see, initial accuracy is around 50%, but it quickly increases to higher values close to 90%.\n",
"As you can see, the initial accuracy is approximately 50%, but it quickly improves to higher values, nearing 90%.\n",
"\n",
"Let's visualize how classes are separated. Our classification function looks like $\\mathbf{w}^Tx$, and it is greater than 0 for one class, and is below 0 for another. Thus, the class separation line is defined by $\\mathbf{w}^Tx = 0$. Since we have only two dimensions $x_0$ and $x_1$, the equation for the line would be $w_0x_0+w_1x_1+w_2 = 0$ (remember that we have explicitly defined an extra dimension $x_2=1$). Let's plot this line:\n"
"Let's visualize how the classes are separated. Our classification function is represented as $\\mathbf{w}^Tx$, which is greater than 0 for one class and less than 0 for the other. Therefore, the class separation line is defined by $\\mathbf{w}^Tx = 0$. Since we are working with only two dimensions, $x_0$ and $x_1$, the equation for the line becomes $w_0x_0 + w_1x_1 + w_2 = 0$ (recall that we explicitly added an extra dimension $x_2 = 1$). Let's plot this line:\n"
]
},
{
@ -379,7 +381,7 @@
"source": [
"## Evaluate on Test Dataset\n",
"\n",
"At the start, we set aside some data for the test dataset. Lets check how accurate our classifier is on this test dataset. To do this, we expand the test dataset with an additional dimension, multiply it by the weights matrix, and ensure that the resulting value has the same sign as the label (+1 or -1). Then, we sum up all the boolean values and divide by the length of the test sample to calculate the accuracy:\n"
"Initially, we set aside some data for the test dataset. Let's check how accurate our classifier is on this test dataset. To do this, we expand the test dataset by adding an extra dimension, multiply it by the weights matrix, and ensure that the resulting value has the same sign as the label (+1 or -1). Then, we sum up all the boolean values and divide by the length of the test sample to calculate the accuracy:\n"
]
},
{
@ -420,7 +422,7 @@
"source": [
"## Observing the training process\n",
"\n",
"Previously, we noticed how accuracy drops during training. It would be interesting to observe how the decision boundary evolves throughout the training. The code below will display everything on a single graph, allowing you to use the slider to \"travel through time\" and explore the training process.\n"
"We previously observed how accuracy decreases during training. It would be interesting to see how the decision boundary evolves during training. The code below will display everything on a single graph, allowing you to use the slider to \"time-travel\" through the training process.\n"
]
},
{
@ -527,16 +529,16 @@
"source": [
"## Limitations of the Perceptron\n",
"\n",
"As mentioned earlier, the perceptron is a **linear classifier**. It works well for distinguishing between two classes if they are **linearly separable**, meaning they can be divided by a straight line. However, if the classes are not linearly separable, the perceptron training process will fail to converge.\n",
"As mentioned earlier, the perceptron is a **linear classifier**. It performs well in distinguishing between two classes if they are **linearly separable**, meaning they can be divided by a straight line. However, if the classes are not linearly separable, the perceptron training process will fail to converge.\n",
"\n",
"A classic example of a problem that a perceptron cannot solve is the **XOR problem**. In this case, we want the perceptron to learn the XOR boolean function, which is represented by the following truth table:\n",
"A classic example of a problem that cannot be solved by a perceptron is the **XOR problem**. In this case, we want the perceptron to learn the XOR boolean function, which is represented by the following truth table:\n",
"\n",
"| | 0 | 1 |\n",
"|---|---|---|\n",
"| 0 | 0 | 1 | \n",
"| 1 | 1 | 0 |\n",
"\n",
"Lets give it a try! Well manually set up all the positive and negative training samples, and then use the train function we defined earlier:\n"
"Lets give it a try! We will manually define all positive and negative training samples and then use the train function we defined earlier:\n"
]
},
{
@ -605,17 +607,17 @@
"source": [
"As you can see from the graph above, the accuracy never exceeds 75%, because it is impossible to draw a straight line that correctly classifies all possible examples.\n",
"\n",
"The XOR problem is a classic example of the limitations of perceptrons, first highlighted by Marvin Minsky and Seymour Papert in 1969 in their book [Perceptrons](https://en.wikipedia.org/wiki/Perceptrons_(book)). This observation significantly slowed research in the field of neural networks for nearly a decade, even though - as we will see in the next section of our course - multi-layer perceptrons are fully capable of solving such problems.\n",
"The XOR problem is a classic example of perceptron limitations, first highlighted by Marvin Minsky and Seymour Papert in 1969 in their book [Perceptrons](https://en.wikipedia.org/wiki/Perceptrons_(book)). This observation significantly slowed down research in neural networks for nearly a decade, even though - as we will explore in the next section of our course - multi-layer perceptrons are fully capable of solving such problems.\n",
"\n",
"## Complex Example - MNIST\n",
"\n",
"Although the perceptron cannot solve the XOR problem, it can handle much more complex tasks, such as recognizing handwritten characters.\n",
"\n",
"A commonly used dataset for learning machine learning is called [MNIST](https://en.wikipedia.org/wiki/MNIST_database). It was created by the Modified National Institute of Standards and Technology and includes a training set of 60,000 handwritten digits collected from approximately 250 students and employees of the institute. Additionally, there is a test dataset of 10,000 digits collected from different individuals.\n",
"A commonly used dataset for learning machine learning is called [MNIST](https://en.wikipedia.org/wiki/MNIST_database). It was created by the Modified National Institute of Standards and Technology and includes a training set of 60,000 handwritten digits collected from approximately 250 students and employees of the institute. Additionally, there is a test dataset containing 10,000 digits collected from different individuals.\n",
"\n",
"All digits are represented as grayscale images with dimensions of 28x28 pixels.\n",
"\n",
"> The MNIST dataset is available as a training competition on [Kaggle](https://www.kaggle.com/c/digit-recognizer), a platform that hosts machine learning competitions and challenges. Once you learn how to classify MNIST digits, you can submit your solution to Kaggle to see how it ranks among other participants.\n",
"> The MNIST Dataset is available as a training competition on [Kaggle](https://www.kaggle.com/c/digit-recognizer), a platform hosting machine learning competitions and challenges. Once you learn how to classify MNIST digits, you can submit your solution to Kaggle to see how it ranks among other participants.\n",
"\n",
"We begin by loading the MNIST dataset:\n"
]
@ -829,13 +831,13 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Please note how accuracy improves significantly as training progresses.\n",
"Please note how accuracy quickly approaches nearly 100%.\n",
"\n",
"Move the slider towards the later stages of training and observe the weight matrix displayed on the left. This matrix helps you understand how the perceptron functions. Youll notice high weight values concentrated in the center of the field, corresponding to pixels typically present in the digit 1, and low negative values on the sides, where parts of the digit 0 are located. If the perceptron is presented with the digit 1, the central pixels will be multiplied by high values, resulting in a positive outcome. Conversely, when the perceptron sees the digit 0, the corresponding pixels will be multiplied by negative values.\n",
"Move the slider to a position near the end of the training and observe the weight matrix displayed on the left. This matrix helps you understand how the perceptron operates. You'll notice high weight values in the center of the field, corresponding to pixels typically present in the digit 1, and low negative values on the sides, where parts of the digit 0 are located. Thus, if the perceptron is presented with the digit 1, the central pixels will be multiplied by high values, resulting in a positive output. Conversely, when the perceptron sees the digit 0, the corresponding pixels are multiplied by negative values.\n",
"\n",
"> You might observe that if we present the perceptron with a digit 1 that is slightly shifted horizontally, causing its pixels to overlap with the vertical parts of the digit 0, the perceptron might produce an incorrect result. This happens because the MNIST dataset ensures that all digits are centered and properly aligned, and the perceptron depends on this alignment to differentiate between digits.\n",
"> You might observe that if we provide the perceptron with a digit 1 that is slightly shifted horizontally, causing its pixels to overlap with areas where vertical parts of the digit 0 are located, the perceptron might produce an incorrect result. This happens because the MNIST dataset ensures all digits are centered and properly aligned, and the perceptron relies on this alignment to differentiate between digits.\n",
"\n",
"Now, lets experiment with different digits:\n"
"Now let's experiment with different digits:\n"
]
},
{
@ -911,11 +913,11 @@
"source": [
"## Discussion\n",
"\n",
"For some reason, 2 and 5 are not easily distinguishable. Even though we achieve relatively high accuracy (above 85%), its clear that the perceptron stops learning at a certain point.\n",
"For some reason, 2 and 5 are not as easily distinguishable. Even though we achieve relatively high accuracy (above 85%), it's evident that the perceptron stops learning at a certain point.\n",
"\n",
"To understand why this happens, we can try using [Principal Component Analysis](https://en.wikipedia.org/wiki/Principal_component_analysis) (PCA). This is a machine learning technique used to reduce the dimensionality of the input dataset in a way that maximizes the separability between classes.\n",
"To understand why this happens, we can use [Principal Component Analysis](https://en.wikipedia.org/wiki/Principal_component_analysis) (PCA). PCA is a machine learning technique designed to reduce the dimensionality of the input dataset in a way that maximizes the separability between classes.\n",
"\n",
"In our case, an input image consists of 784 pixels (input features), and we want to use PCA to reduce the number of parameters to just 2, so we can plot them on a graph. These two parameters would be a linear combination of the original features, and we can think of this process as \"rotating\" our original 784-dimensional space and observing its projection onto a 2D space, until we find the best view that separates the classes.\n"
"In our case, an input image consists of 784 pixels (input features), and we aim to use PCA to reduce the number of parameters to just 2, allowing us to plot them on a graph. These two parameters would represent a linear combination of the original features, and this process can be thought of as \"rotating\" our original 784-dimensional space and observing its projection onto a 2D space, until we achieve the best view for separating the classes.\n"
]
},
{
@ -1025,13 +1027,13 @@
}
},
"source": [
"As you can see, 0 and 1 can be clearly separated by a straight line. This shows that in the original 784-dimensional space, the points corresponding to these digits are also linearly separable. However, in the case of 2 and 5, its not possible to find a good projection that separates the digits clearly, which leads to some misclassifications.\n",
"As you can see, 0 and 1 can be clearly separated by a straight line. This shows that in the original 784-dimensional space, the points corresponding to these digits are also linearly separable. However, in the case of 2 and 5, it is not possible to find a good projection that separates the digits clearly, which leads to some cases of misclassification.\n",
"\n",
"> Later in this course, we will learn how to create non-linear classifiers using Neural Networks and how to address the issue of digits not being properly aligned. Very soon, we will achieve over 99% accuracy in MNIST digit classification, categorizing them into 10 different classes.\n",
"> Later in this course, we will learn how to create non-linear classifiers using Neural Networks and how to address the issue of digits not being properly aligned. Very soon, we will achieve over 99% accuracy in MNIST digit classification while categorizing them into 10 different classes.\n",
"\n",
"## Takeaway\n",
"\n",
" * We have learned about the simplest neural network architecture - the one-layer perceptron.\n",
" * We have learned about the simplest neural network architecture the one-layer perceptron.\n",
" * We implemented the perceptron \"manually,\" using a simple training procedure based on gradient descent.\n",
" * Despite its simplicity, the one-layer perceptron can solve relatively complex problems like handwritten digit recognition.\n",
" * The one-layer perceptron is a linear classifier, offering the same classification capabilities as logistic regression.\n",
@ -1044,14 +1046,14 @@
"source": [
"## Credits\n",
"\n",
"This notebook is part of the [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners) and was created by [Dmitry Soshnikov](http://soshnikov.com). It draws inspiration from the Neural Network Workshop at Microsoft Research Cambridge. Some code and visual materials are sourced from presentations by [Katja Hoffmann](https://www.microsoft.com/en-us/research/people/kahofman/), [Matthew Johnson](https://www.microsoft.com/en-us/research/people/matjoh/), and [Ryoto Tomioka](https://www.microsoft.com/en-us/research/people/ryoto/), as well as from the [NeuroWorkshop](http://github.com/shwars/NeuroWorkshop) repository.\n"
"This notebook is part of the [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners) and was prepared by [Dmitry Soshnikov](http://soshnikov.com). It draws inspiration from the Neural Network Workshop at Microsoft Research Cambridge. Some code and illustrative materials are sourced from presentations by [Katja Hoffmann](https://www.microsoft.com/en-us/research/people/kahofman/), [Matthew Johnson](https://www.microsoft.com/en-us/research/people/matjoh/), and [Ryoto Tomioka](https://www.microsoft.com/en-us/research/people/ryoto/), as well as the [NeuroWorkshop](http://github.com/shwars/NeuroWorkshop) repository.\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Disclaimer**: \nThis document has been translated using the AI translation service [Co-op Translator](https://github.com/Azure/co-op-translator). While we aim for accuracy, please note that automated translations may include errors or inaccuracies. The original document in its native language should be regarded as the authoritative source. For critical information, professional human translation is advised. We are not responsible for any misunderstandings or misinterpretations resulting from the use of this translation.\n"
"\n---\n\n**Disclaimer**: \nThis document has been translated using the AI translation service [Co-op Translator](https://github.com/Azure/co-op-translator). While we aim for accuracy, please note that automated translations may contain errors or inaccuracies. The original document in its native language should be regarded as the authoritative source. For critical information, professional human translation is recommended. We are not responsible for any misunderstandings or misinterpretations resulting from the use of this translation.\n"
]
}
],
@ -1080,8 +1082,8 @@
"start_slideshow_at": "selected"
},
"coopTranslator": {
"original_hash": "914fc55f59efc7e17b8130d4033ac617",
"translation_date": "2025-08-31T18:22:35+00:00",
"original_hash": "d67e5b54ba20b507aa88d71aa3d042d8",
"translation_date": "2025-10-03T13:03:12+00:00",
"source_file": "lessons/3-NeuralNetworks/03-Perceptron/Perceptron.ipynb",
"language_code": "en"
}

View File

@ -11,9 +11,9 @@
"source": [
"## Perceptrón\n",
"\n",
"> Este cuaderno es parte del [Currículo de IA para Principiantes](http://github.com/microsoft/ai-for-beginners). Visita el repositorio para acceder al conjunto completo de materiales de aprendizaje.\n",
"> Este cuaderno forma parte del [Currículo de IA para Principiantes](http://github.com/microsoft/ai-for-beginners). Visita el repositorio para obtener el conjunto completo de materiales de aprendizaje.\n",
"\n",
"Como hemos discutido, el perceptrón te permite resolver un **problema de clasificación binaria**, es decir, clasificar ejemplos de entrada en dos clases - podemos llamarlas **positiva** y **negativa**.\n",
"Como hemos comentado, el perceptrón te permite resolver problemas de **clasificación binaria**, es decir, clasificar ejemplos de entrada en dos clases: podemos llamarlas **positiva** y **negativa**.\n",
"\n",
"Primero, importemos algunas bibliotecas necesarias.\n"
]
@ -95,7 +95,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Vamos también a graficar el conjunto de datos:\n"
"También vamos a graficar el conjunto de datos:\n"
]
},
{
@ -154,7 +154,7 @@
"source": [
"## Perceptrón\n",
"\n",
"Dado que el perceptrón es un clasificador binario, para cada vector de entrada $x$, la salida de nuestro perceptrón será +1 o -1, dependiendo de la clase. La salida se calculará usando la fórmula\n",
"Dado que el perceptrón es un clasificador binario, para cada vector de entrada $x$, la salida de nuestro perceptrón será +1 o -1, dependiendo de la clase. La salida se calculará utilizando la fórmula\n",
"\n",
"$$y(\\mathbf{x}) = f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x})$$\n",
"\n",
@ -166,7 +166,7 @@
" \\end{cases} \\\\\n",
"$$\n",
"\n",
"Sin embargo, un modelo lineal genérico también debería tener un sesgo, es decir, idealmente deberíamos calcular $y$ como $y=f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}+\\mathbf{b})$. Para simplificar nuestro modelo, podemos eliminar este término de sesgo añadiendo una dimensión más a nuestras características de entrada, que siempre será igual a 1:\n"
"Sin embargo, un modelo lineal genérico también debería tener un sesgo, es decir, idealmente deberíamos calcular $y$ como $y=f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}+\\mathbf{b})$. Para simplificar nuestro modelo, podemos eliminar este término de sesgo añadiendo una dimensión adicional a nuestras características de entrada, que siempre será igual a 1:\n"
]
},
{
@ -271,7 +271,9 @@
{
"cell_type": "markdown",
"metadata": {},
"source": []
"source": [
"Ahora ejecutemos el entrenamiento en nuestro conjunto de datos:\n"
]
},
{
"cell_type": "code",
@ -309,9 +311,9 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Como puedes ver, la precisión inicial es alrededor del 50%, pero rápidamente aumenta a valores más altos cercanos al 90%.\n",
"Como puedes ver, la precisión inicial es de alrededor del 50%, pero aumenta rápidamente a valores más altos cercanos al 90%.\n",
"\n",
"Visualicemos cómo se separan las clases. Nuestra función de clasificación se ve como $\\mathbf{w}^Tx$, y es mayor que 0 para una clase, y menor que 0 para la otra. Por lo tanto, la línea de separación de clases está definida por $\\mathbf{w}^Tx = 0$. Dado que solo tenemos dos dimensiones $x_0$ y $x_1$, la ecuación de la línea sería $w_0x_0+w_1x_1+w_2 = 0$ (recuerda que hemos definido explícitamente una dimensión extra $x_2=1$). Vamos a graficar esta línea:\n"
"Visualicemos cómo se separan las clases. Nuestra función de clasificación tiene la forma $\\mathbf{w}^Tx$, y es mayor que 0 para una clase, y menor que 0 para la otra. Por lo tanto, la línea de separación de clases está definida por $\\mathbf{w}^Tx = 0$. Dado que solo tenemos dos dimensiones, $x_0$ y $x_1$, la ecuación de la línea sería $w_0x_0+w_1x_1+w_2 = 0$ (recuerda que hemos definido explícitamente una dimensión extra $x_2=1$). Vamos a graficar esta línea:\n"
]
},
{
@ -377,9 +379,9 @@
}
},
"source": [
"## Evaluar en el Conjunto de Datos de Prueba\n",
"## Evaluar en el conjunto de datos de prueba\n",
"\n",
"Al principio, apartamos algunos datos para el conjunto de datos de prueba. Veamos qué tan preciso es nuestro clasificador en este conjunto de prueba. Para hacer esto, también ampliamos el conjunto de prueba con una dimensión adicional, lo multiplicamos por la matriz de pesos y nos aseguramos de que el valor obtenido tenga el mismo signo que la etiqueta (+1 o -1). Luego sumamos todos los valores booleanos y los dividimos por la longitud de la muestra de prueba para obtener la precisión:\n"
"Al principio, apartamos algunos datos para el conjunto de prueba. Veamos qué tan preciso es nuestro clasificador en este conjunto de prueba. Para hacerlo, también ampliamos el conjunto de prueba con una dimensión extra, lo multiplicamos por la matriz de pesos y verificamos que el valor obtenido tenga el mismo signo que la etiqueta (+1 o -1). Luego sumamos todos los valores booleanos y dividimos por la longitud de la muestra de prueba para obtener la precisión:\n"
]
},
{
@ -420,7 +422,7 @@
"source": [
"## Observando el proceso de entrenamiento\n",
"\n",
"Hemos visto antes cómo la precisión disminuye durante el entrenamiento. Sería interesante observar cómo se comporta la línea de separación durante el entrenamiento. El siguiente código visualizará todo en un solo gráfico, y deberías poder mover el control deslizante para \"viajar en el tiempo\" a través del proceso de entrenamiento.\n"
"Hemos visto anteriormente cómo la precisión disminuye durante el entrenamiento. Sería interesante observar cómo se comporta la línea de separación durante el entrenamiento. El código a continuación visualizará todo en un solo gráfico, y deberías poder mover el deslizador para \"viajar en el tiempo\" a través del proceso de entrenamiento.\n"
]
},
{
@ -603,19 +605,19 @@
}
},
"source": [
"Como puedes ver en el gráfico anterior, la precisión nunca supera el 75%, porque es imposible trazar una línea recta de manera que todos los ejemplos posibles sean clasificados correctamente.\n",
"Como puedes ver en el gráfico anterior, la precisión nunca supera el 75%, porque es imposible trazar una línea recta de manera que todos los ejemplos posibles sean correctos.\n",
"\n",
"El problema de XOR es un ejemplo clásico de las limitaciones del perceptrón, y fue señalado por Marvin Minsky y Seymour Papert en 1969 en su libro [Perceptrons](https://en.wikipedia.org/wiki/Perceptrons_(book)). Esta observación limitó la investigación en el área de redes neuronales durante casi 10 años, aunque - y lo veremos en la siguiente sección de nuestro curso - los perceptrones multicapa son perfectamente capaces de resolver este tipo de problemas.\n",
"El problema XOR es un ejemplo clásico de las limitaciones del perceptrón, y fue señalado por Marvin Minsky y Seymour Papert en 1969 en su libro [Perceptrons](https://en.wikipedia.org/wiki/Perceptrons_(book)). Esta observación limitó la investigación en el área de redes neuronales durante casi 10 años, aunque - y veremos esto en la próxima sección de nuestro curso - los perceptrones multicapa son perfectamente capaces de resolver este tipo de problemas.\n",
"\n",
"## Ejemplo Complejo - MNIST\n",
"\n",
"Aunque el perceptrón no puede resolver el problema de XOR, sí puede abordar problemas mucho más complejos, como el reconocimiento de caracteres escritos a mano.\n",
"Aunque el perceptrón no puede resolver el problema XOR, sí puede resolver problemas mucho más complejos, como el reconocimiento de caracteres escritos a mano.\n",
"\n",
"Un conjunto de datos que se utiliza frecuentemente al aprender sobre aprendizaje automático se llama [MNIST](https://en.wikipedia.org/wiki/MNIST_database). Fue creado por el Instituto Nacional de Estándares y Tecnología Modificado (Modified National Institute of Standards and Technology) y contiene un conjunto de entrenamiento de 60,000 dígitos escritos a mano, recopilados de aproximadamente 250 estudiantes y empleados del instituto. También hay un conjunto de prueba con 10,000 dígitos, recopilados de diferentes individuos.\n",
"Un conjunto de datos que se utiliza frecuentemente para aprender sobre aprendizaje automático se llama [MNIST](https://en.wikipedia.org/wiki/MNIST_database). Fue creado por el Instituto Nacional de Estándares y Tecnología Modificado y contiene un conjunto de entrenamiento de 60,000 dígitos escritos a mano, recopilados de alrededor de 250 estudiantes y empleados del instituto. También hay un conjunto de prueba de 10,000 dígitos, recopilados de diferentes individuos.\n",
"\n",
"Todos los dígitos están representados por imágenes en escala de grises de tamaño 28x28 píxeles.\n",
"\n",
"> El conjunto de datos MNIST está disponible como una competencia de entrenamiento en [Kaggle](https://www.kaggle.com/c/digit-recognizer), un sitio que organiza competencias y concursos de aprendizaje automático. Una vez que aprendas a clasificar los dígitos de MNIST, puedes enviar tu solución a Kaggle para ver cómo se clasifica entre otros participantes.\n",
"> El conjunto de datos MNIST está disponible como una competencia de entrenamiento en [Kaggle](https://www.kaggle.com/c/digit-recognizer), un sitio que organiza competencias y concursos de aprendizaje automático. Una vez que aprendas a clasificar los dígitos de MNIST, puedes enviar tu solución a Kaggle para ver cómo se califica entre otros participantes.\n",
"\n",
"Comenzamos cargando el conjunto de datos MNIST:\n"
]
@ -829,11 +831,11 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Por favor, observa cómo la precisión aumenta casi al 100% muy rápidamente.\n",
"Ten en cuenta cómo la precisión sube casi al 100% muy rápidamente.\n",
"\n",
"Por favor, mueve el deslizador hacia alguna posición cerca del final del entrenamiento y observa la matriz de pesos que se muestra a la izquierda. Esta matriz te permitirá entender cómo funciona realmente el perceptrón. Puedes ver los valores altos de peso en el centro del campo, que corresponden a los píxeles que suelen estar presentes en el dígito 1, y valores negativos bajos en los lados, donde se encuentran partes del dígito 0. Entonces, si el dígito presentado al perceptrón es de hecho un 1, la parte central será multiplicada por valores altos, produciendo un resultado positivo. Por el contrario, cuando el perceptrón observa un 0, los píxeles correspondientes serán multiplicados por números negativos.\n",
"Por favor, mueve el deslizador hacia alguna posición cerca del final del entrenamiento y observa la matriz de pesos representada a la izquierda. Esta matriz te permitirá entender cómo funciona realmente el perceptrón. Puedes ver los valores altos de los pesos en el centro del campo, que corresponden a los píxeles que suelen estar presentes en el dígito 1, y valores negativos bajos en los lados, donde se encuentran partes del dígito 0. Entonces, si el dígito presentado al perceptrón es de hecho un 1, la parte central será multiplicada por valores altos, produciendo un resultado positivo. Por el contrario, cuando el perceptrón observa un 0, los píxeles correspondientes serán multiplicados por números negativos.\n",
"\n",
"> Puedes notar que si le damos a nuestro perceptrón un dígito 1 ligeramente desplazado horizontalmente, de manera que sus píxeles ocupen el lugar donde hay partes verticales del 0, podríamos obtener un resultado incorrecto. Dado que la naturaleza de nuestro conjunto de datos MNIST es tal que todos los dígitos están centrados y posicionados correctamente, el perceptrón depende de esto para distinguir entre los dígitos.\n",
"> Puedes notar que si le damos a nuestro perceptrón un dígito 1 ligeramente desplazado horizontalmente, de manera que sus píxeles ocupen el lugar donde están las partes verticales del 0, podríamos obtener un resultado incorrecto. Esto se debe a que la naturaleza de nuestro conjunto de datos MNIST es tal que todos los dígitos están centrados y posicionados correctamente, y el perceptrón depende de esto para distinguir entre los dígitos.\n",
"\n",
"Ahora probemos con diferentes dígitos:\n"
]
@ -913,9 +915,9 @@
"\n",
"Por alguna razón, 2 y 5 no son tan fácilmente separables. Aunque obtenemos una precisión relativamente alta (por encima del 85%), podemos ver claramente cómo el perceptrón deja de aprender en cierto punto.\n",
"\n",
"Para entender por qué sucede esto, podemos intentar usar [Análisis de Componentes Principales](https://en.wikipedia.org/wiki/Principal_component_analysis) (PCA). Es una técnica de aprendizaje automático utilizada para reducir la dimensionalidad del conjunto de datos de entrada, de manera que se obtenga la mejor separabilidad entre clases.\n",
"Para entender por qué sucede esto, podemos intentar usar [Análisis de Componentes Principales](https://es.wikipedia.org/wiki/An%C3%A1lisis_de_componentes_principales) (PCA). Es una técnica de aprendizaje automático utilizada para reducir la dimensionalidad del conjunto de datos de entrada, de manera que se obtenga la mejor separabilidad entre clases.\n",
"\n",
"En nuestro caso, una imagen de entrada tiene 784 píxeles (características de entrada), y queremos usar PCA para reducir el número de parámetros a solo 2, de modo que podamos graficarlos. Esos dos parámetros serían una combinación lineal de las características originales, y podemos ver este procedimiento como \"rotar\" nuestro espacio original de 784 dimensiones y observar su proyección en nuestro espacio 2D, hasta obtener la mejor vista que separa las clases.\n"
"En nuestro caso, una imagen de entrada tiene 784 píxeles (características de entrada), y queremos usar PCA para reducir el número de parámetros a solo 2, de modo que podamos graficarlos. Esos dos parámetros serían una combinación lineal de las características originales, y podemos ver este procedimiento como una \"rotación\" de nuestro espacio original de 784 dimensiones y observar su proyección en nuestro espacio 2D, hasta obtener la mejor vista que separa las clases.\n"
]
},
{
@ -1027,7 +1029,7 @@
"source": [
"Como puedes ver, 0 y 1 pueden separarse claramente mediante una línea recta. Esto indica que en el espacio original de 784 dimensiones, los puntos correspondientes a los dígitos también son linealmente separables. En el caso de 2 y 5, no podemos encontrar una buena proyección que separe los dígitos claramente, y por lo tanto, hay algunos casos de clasificación incorrecta.\n",
"\n",
"> Más adelante en este curso aprenderemos cómo crear clasificadores no lineales utilizando Redes Neuronales, y cómo abordar el problema de dígitos que no están correctamente alineados. Muy pronto alcanzaremos más del 99% de precisión en la clasificación de dígitos MNIST, clasificándolos en 10 clases diferentes.\n",
"> Más adelante en este curso aprenderemos cómo crear clasificadores no lineales utilizando Redes Neuronales, y cómo abordar el problema de los dígitos que no están correctamente alineados. Muy pronto alcanzaremos más del 99% de precisión en la clasificación de dígitos MNIST, clasificándolos en 10 clases diferentes.\n",
"\n",
"## Conclusiones\n",
"\n",
@ -1051,7 +1053,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Descargo de responsabilidad**: \nEste documento ha sido traducido utilizando el servicio de traducción automática [Co-op Translator](https://github.com/Azure/co-op-translator). Aunque nos esforzamos por garantizar la precisión, tenga en cuenta que las traducciones automatizadas pueden contener errores o imprecisiones. El documento original en su idioma nativo debe considerarse como la fuente autorizada. Para información crítica, se recomienda una traducción profesional realizada por humanos. No nos hacemos responsables de malentendidos o interpretaciones erróneas que puedan surgir del uso de esta traducción.\n"
"\n---\n\n**Descargo de responsabilidad**: \nEste documento ha sido traducido utilizando el servicio de traducción automática [Co-op Translator](https://github.com/Azure/co-op-translator). Si bien nos esforzamos por lograr precisión, tenga en cuenta que las traducciones automáticas pueden contener errores o imprecisiones. El documento original en su idioma nativo debe considerarse como la fuente autorizada. Para información crítica, se recomienda una traducción profesional realizada por humanos. No nos hacemos responsables de malentendidos o interpretaciones erróneas que surjan del uso de esta traducción.\n"
]
}
],
@ -1080,8 +1082,8 @@
"start_slideshow_at": "selected"
},
"coopTranslator": {
"original_hash": "914fc55f59efc7e17b8130d4033ac617",
"translation_date": "2025-08-31T16:34:24+00:00",
"original_hash": "d67e5b54ba20b507aa88d71aa3d042d8",
"translation_date": "2025-10-03T13:05:04+00:00",
"source_file": "lessons/3-NeuralNetworks/03-Perceptron/Perceptron.ipynb",
"language_code": "es"
}

View File

@ -11,9 +11,9 @@
"source": [
"## پرسپترون\n",
"\n",
"> این دفترچه بخشی از [برنامه درسی هوش مصنوعی برای مبتدیان](http://github.com/microsoft/ai-for-beginners) است. برای دسترسی به مجموعه کامل مطالب آموزشی به مخزن مراجعه کنید.\n",
"> این دفترچه بخشی از [مجموعه آموزشی هوش مصنوعی برای مبتدیان](http://github.com/microsoft/ai-for-beginners) است. برای دسترسی به مجموعه کامل مطالب آموزشی به مخزن مراجعه کنید.\n",
"\n",
"همانطور که بحث کردیم، پرسپترون به شما امکان می‌دهد **مسئله طبقه‌بندی دودویی** را حل کنید، یعنی ورودی‌ها را به دو کلاس تقسیم کنید - که می‌توانیم آنها را **مثبت** و **منفی** بنامیم.\n",
"همانطور که بحث کردیم، پرسپترون به شما امکان می‌دهد **مسئله طبقه‌بندی دودویی** را حل کنید، یعنی ورودی‌ها را به دو کلاس تقسیم کنید - که می‌توانیم آنها را **مثبت** و **منفی** بنامیم.\n",
"\n",
"ابتدا، بیایید برخی از کتابخانه‌های مورد نیاز را وارد کنیم.\n"
]
@ -47,11 +47,11 @@
}
},
"source": [
"## مسئله ساده\n",
"## مسئله نمونه\n",
"\n",
"برای شروع، بیایید با یک مسئله ساده آغاز کنیم که در آن دو ویژگی ورودی داریم. به عنوان مثال، در پزشکی ممکن است بخواهیم تومورها را بر اساس اندازه و سن به دو دسته خوش‌خیم و بدخیم طبقه‌بندی کنیم.\n",
"برای شروع، بیایید با یک مسئله نمونه آغاز کنیم، جایی که دو ویژگی ورودی داریم. به عنوان مثال، در پزشکی ممکن است بخواهیم تومورها را بر اساس اندازه و سن آن‌ها به دو دسته خوش‌خیم و بدخیم طبقه‌بندی کنیم.\n",
"\n",
"ما یک مجموعه داده طبقه‌بندی تصادفی با استفاده از تابع `make_classification` از کتابخانه SciKit Learn تولید خواهیم کرد:\n"
"ما یک مجموعه داده طبقه‌بندی تصادفی با استفاده از تابع `make_classification` از کتابخانه SciKit Learn ایجاد خواهیم کرد:\n"
]
},
{
@ -95,7 +95,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"بیایید مجموعه داده را نیز ترسیم کنیم:\n"
"بیایید مجموعه داده را نیز رسم کنیم:\n"
]
},
{
@ -154,7 +154,7 @@
"source": [
"## پرسپترون\n",
"\n",
"از آنجا که پرسپترون یک دسته‌بند دودویی است، برای هر بردار ورودی $x$ خروجی پرسپترون ما یا +1 خواهد بود یا -1، بسته به کلاس. خروجی با استفاده از فرمول زیر محاسبه می‌شود:\n",
"از آنجا که پرسپترون یک دسته‌بند دودویی است، برای هر بردار ورودی $x$، خروجی پرسپترون ما بسته به کلاس، یا +1 یا -1 خواهد بود. خروجی با استفاده از فرمول زیر محاسبه می‌شود:\n",
"\n",
"$$y(\\mathbf{x}) = f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x})$$\n",
"\n",
@ -211,9 +211,9 @@
"$$E(\\mathbf{w}) = -\\sum_{n \\in \\mathcal{M}}\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}_{n}t_{n}$$\n",
" \n",
" * $t_{n} \\in \\{-1, +1\\}$ برای نمونه‌های آموزشی منفی و مثبت به ترتیب\n",
" * $\\mathcal{M}$ - مجموعه‌ای از مثال‌هایی که به اشتباه دسته‌بندی شده‌اند\n",
" * $\\mathcal{M}$ - مجموعه‌ای از مثال‌های اشتباه طبقه‌بندی‌شده\n",
" \n",
"ما از فرآیند **نزول گرادیان** استفاده خواهیم کرد. با شروع از وزن‌های اولیه تصادفی $\\mathbf{w}^{(0)}$، وزن‌ها را در هر مرحله از آموزش با استفاده از گرادیان $E$ تنظیم می‌کنیم:\n",
"ما از فرآیند **نزول گرادیان** استفاده خواهیم کرد. با شروع از وزن‌های اولیه تصادفی $\\mathbf{w}^{(0)}$، وزن‌ها را در هر مرحله از آموزش با استفاده از گرادیان $E$ تنظیم خواهیم کرد:\n",
"\n",
"$$\\mathbf{w}^{\\tau + 1}=\\mathbf{w}^{\\tau} - \\eta \\nabla E(\\mathbf{w}) = \\mathbf{w}^{\\tau} + \\eta\\sum_{n \\in \\mathcal{M}}\\mathbf{x}_{n} t_{n}$$\n",
"\n",
@ -271,7 +271,9 @@
{
"cell_type": "markdown",
"metadata": {},
"source": []
"source": [
"حالا بیایید آموزش را روی مجموعه داده خود اجرا کنیم:\n"
]
},
{
"cell_type": "code",
@ -309,9 +311,9 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"همانطور که مشاهده می‌کنید، دقت اولیه حدود ۵۰٪ است، اما به سرعت به مقادیر بالاتر نزدیک به ۹۰٪ افزایش می‌یابد.\n",
"همان‌طور که می‌بینید، دقت اولیه حدود ۵۰٪ است، اما به‌سرعت به مقادیر بالاتری نزدیک به ۹۰٪ افزایش می‌یابد.\n",
"\n",
"بیایید ببینیم چگونه کلاس‌ها از یکدیگر جدا می‌شوند. تابع طبقه‌بندی ما به صورت $\\mathbf{w}^Tx$ است، و برای یک کلاس بزرگتر از ۰ و برای کلاس دیگر کمتر از ۰ است. بنابراین، خط جداسازی کلاس‌ها با $\\mathbf{w}^Tx = 0$ تعریف می‌شود. از آنجا که فقط دو بعد $x_0$ و $x_1$ داریم، معادله خط به صورت $w_0x_0+w_1x_1+w_2 = 0$ خواهد بود (به یاد داشته باشید که ما به طور صریح یک بعد اضافی $x_2=1$ تعریف کرده‌ایم). بیایید این خط را رسم کنیم:\n"
"بیایید ببینیم چگونه کلاس‌ها از هم جدا می‌شوند. تابع طبقه‌بندی ما به شکل $\\mathbf{w}^Tx$ است و برای یک کلاس بزرگ‌تر از ۰ و برای کلاس دیگر کمتر از ۰ است. بنابراین، خط جداسازی کلاس‌ها با $\\mathbf{w}^Tx = 0$ تعریف می‌شود. از آنجا که ما فقط دو بُعد $x_0$ و $x_1$ داریم، معادله خط به صورت $w_0x_0+w_1x_1+w_2 = 0$ خواهد بود (به یاد داشته باشید که ما به‌طور صریح یک بُعد اضافی $x_2=1$ تعریف کرده‌ایم). بیایید این خط را رسم کنیم:\n"
]
},
{
@ -377,9 +379,9 @@
}
},
"source": [
"## ارزیابی بر روی مجموعه داده آزمایشی\n",
"## ارزیابی روی مجموعه داده تست\n",
"\n",
"در ابتدا، مقداری داده را برای مجموعه داده آزمایشی کنار گذاشته‌ایم. بیایید ببینیم که طبقه‌بند ما چقدر روی این مجموعه داده آزمایشی دقیق عمل می‌کند. برای انجام این کار، مجموعه داده آزمایشی را با یک بعد اضافی گسترش می‌دهیم، آن را در ماتریس وزن‌ها ضرب می‌کنیم و مطمئن می‌شویم که مقدار به‌دست‌آمده همان علامت برچسب (+1 یا -1) را دارد. سپس تمام مقادیر بولی را با هم جمع کرده و بر طول نمونه آزمایشی تقسیم می‌کنیم تا دقت را به دست آوریم:\n"
"در ابتدا، مقداری از داده‌ها را برای مجموعه داده تست کنار گذاشتیم. بیایید ببینیم که طبقه‌بند ما روی این مجموعه داده تست چقدر دقیق است. برای انجام این کار، مجموعه داده تست را با یک بُعد اضافی گسترش می‌دهیم، آن را در ماتریس وزن‌ها ضرب می‌کنیم و اطمینان حاصل می‌کنیم که مقدار به‌دست‌آمده همان علامت برچسب باشد (+1 یا -1). سپس تمام مقادیر بولی را با هم جمع کرده و بر طول نمونه تست تقسیم می‌کنیم تا دقت را به دست آوریم:\n"
]
},
{
@ -420,7 +422,7 @@
"source": [
"## مشاهده فرآیند آموزش\n",
"\n",
"قبلاً دیده‌ایم که چگونه دقت در طول آموزش کاهش می‌یابد. خوب است ببینیم که خط جداسازی در طول آموزش چگونه رفتار می‌کند. کد زیر همه چیز را روی یک نمودار نمایش می‌دهد و شما باید بتوانید با حرکت دادن اسلایدر، در فرآیند آموزش \"سفر در زمان\" کنید.\n"
"قبلاً دیده‌ایم که چگونه دقت در طول آموزش کاهش می‌یابد. جالب است که ببینیم خط جداسازی در طول آموزش چگونه رفتار می‌کند. کد زیر همه چیز را در یک نمودار نمایش می‌دهد و شما باید بتوانید با حرکت دادن اسلایدر، در طول فرآیند آموزش \"سفر در زمان\" کنید.\n"
]
},
{
@ -527,16 +529,16 @@
"source": [
"## محدودیت‌های پرسپترون\n",
"\n",
"همان‌طور که در بالا مشاهده کردید، پرسپترون یک **دسته‌بند خطی** است. اگر دو کلاس **به‌صورت خطی قابل تفکیک** باشند، یعنی بتوان آن‌ها را با یک خط مستقیم جدا کرد، پرسپترون می‌تواند به خوبی بین آن‌ها تمایز قائل شود. در غیر این صورت، فرآیند آموزش پرسپترون به نتیجه نخواهد رسید.\n",
"همان‌طور که در بالا مشاهده کردید، پرسپترون یک **طبقه‌بند خطی** است. اگر دو کلاس **به‌صورت خطی قابل تفکیک** باشند، یعنی بتوان آن‌ها را با یک خط مستقیم جدا کرد، پرسپترون می‌تواند بهخوبی بین آن‌ها تمایز قائل شود. در غیر این صورت، فرآیند آموزش پرسپترون به نتیجه نخواهد رسید.\n",
"\n",
"یکی از واضح‌ترین مثال‌های مسئله‌ای که پرسپترون نمی‌تواند آن را حل کند، مسئله معروف **XOR** است. ما می‌خواهیم پرسپترون ما تابع بولی XOR را یاد بگیرد که جدول حقیقت آن به صورت زیر است:\n",
"یک مثال واضح از مسئله‌ای که پرسپترون نمی‌تواند آن را حل کند، مسئله معروف **XOR** است. ما می‌خواهیم پرسپترون ما تابع بولی XOR را یاد بگیرد که جدول حقیقت آن به صورت زیر است:\n",
"\n",
"| | 0 | 1 |\n",
"|---|---|---|\n",
"| 0 | 0 | 1 | \n",
"| 1 | 1 | 0 |\n",
"\n",
"بیایید این کار را امتحان کنیم! ابتدا تمام نمونه‌های مثبت و منفی آموزشی را به‌صورت دستی وارد می‌کنیم و سپس تابع آموزش خود را که در بالا تعریف شده است، فراخوانی می‌کنیم:\n"
"بیایید این کار را امتحان کنیم! ما به‌صورت دستی تمام نمونه‌های آموزشی مثبت و منفی را وارد می‌کنیم و سپس تابع train که در بالا تعریف شده است را فراخوانی می‌کنیم:\n"
]
},
{
@ -603,19 +605,19 @@
}
},
"source": [
"همان‌طور که از نمودار بالا مشاهده می‌کنید، دقت هرگز از ۷۵٪ بالاتر نمی‌رود، زیرا رسم یک خط مستقیم به گونه‌ای که تمام مثال‌های ممکن را درست کند، غیرممکن است.\n",
"همان‌طور که از نمودار بالا مشاهده می‌کنید، دقت هرگز از ۷۵٪ بالاتر نمی‌رود، زیرا امکان رسم یک خط مستقیم به گونه‌ای که تمام مثال‌های ممکن را درست کند وجود ندارد.\n",
"\n",
"مسئله XOR یک مثال کلاسیک از محدودیت‌های پرسپترون است و در سال ۱۹۶۹ توسط ماروین مینسکی و سیمور پاپرت در کتابشان [Pereceptrons](https://en.wikipedia.org/wiki/Perceptrons_(book)) مطرح شد. این مشاهده باعث شد که تحقیقات در زمینه شبکه‌های عصبی تقریباً به مدت ۱۰ سال محدود شود، حتی با وجود اینکه - و این را در بخش بعدی دوره خود خواهیم دید - پرسپترون‌های چندلایه کاملاً قادر به حل چنین مشکلاتی هستند.\n",
"مسئله XOR یک مثال کلاسیک از محدودیت‌های پرسپترون است و در سال ۱۹۶۹ توسط ماروین مینسکی و سیمور پاپرت در کتابشان [پرسپترون‌ها](https://en.wikipedia.org/wiki/Perceptrons_(book)) مطرح شد. این مشاهده باعث شد که تحقیقات در زمینه شبکه‌های عصبی تقریباً به مدت ۱۰ سال محدود شود، حتی با وجود اینکه - و این را در بخش بعدی دوره خود خواهیم دید - پرسپترون‌های چندلایه کاملاً قادر به حل چنین مسائلی هستند.\n",
"\n",
"## مثال پیچیده - MNIST\n",
"\n",
"با اینکه پرسپترون نمی‌تواند مسئله XOR را حل کند، اما می‌تواند بسیاری از مسائل پیچیده‌تر، مانند تشخیص دست‌نویس کاراکترها را حل کند.\n",
"با اینکه پرسپترون نمی‌تواند مسئله XOR را حل کند، اما می‌تواند مسائل بسیار پیچیده‌تری مانند تشخیص دست‌نویس کاراکترها را حل کند.\n",
"\n",
"یک مجموعه داده که اغلب هنگام یادگیری ماشین استفاده می‌شود، [MNIST](https://en.wikipedia.org/wiki/MNIST_database) نام دارد. این مجموعه داده توسط مؤسسه ملی استانداردهای اصلاح‌شده ایجاد شده و شامل یک مجموعه آموزشی از ۶۰,۰۰۰ رقم دست‌نویس است که از حدود ۲۵۰ دانشجو و کارمند مؤسسه جمع‌آوری شده است. همچنین یک مجموعه داده آزمایشی شامل ۱۰,۰۰۰ رقم وجود دارد که از افراد مختلف جمع‌آوری شده است.\n",
"یک مجموعه داده که اغلب هنگام یادگیری ماشین مورد استفاده قرار می‌گیرد، [MNIST](https://en.wikipedia.org/wiki/MNIST_database) نام دارد. این مجموعه داده توسط مؤسسه ملی استانداردهای اصلاح‌شده ایجاد شده و شامل یک مجموعه آموزشی از ۶۰,۰۰۰ رقم دست‌نویس است که از حدود ۲۵۰ دانشجو و کارمند مؤسسه جمع‌آوری شده است. همچنین یک مجموعه داده آزمایشی شامل ۱۰,۰۰۰ رقم وجود دارد که از افراد مختلف جمع‌آوری شده است.\n",
"\n",
"تمام ارقام به صورت تصاویر خاکستری با اندازه ۲۸x۲۸ پیکسل نمایش داده شده‌اند.\n",
"\n",
"> مجموعه داده MNIST به عنوان یک رقابت آموزشی در [Kaggle](https://www.kaggle.com/c/digit-recognizer) در دسترس است، سایتی که مسابقات و رقابت‌های یادگیری ماشین را میزبانی می‌کند. هنگامی که یاد گرفتید چگونه ارقام MNIST را طبقه‌بندی کنید، می‌توانید راه‌حل خود را به Kaggle ارسال کنید تا ببینید چگونه در میان سایر شرکت‌کنندگان رتبه‌بندی می‌شود.\n",
"> مجموعه داده MNIST به عنوان یک رقابت آموزشی در [Kaggle](https://www.kaggle.com/c/digit-recognizer) موجود است، سایتی که مسابقات و رقابت‌های یادگیری ماشین را میزبانی می‌کند. هنگامی که یاد گرفتید چگونه ارقام MNIST را طبقه‌بندی کنید، می‌توانید راه‌حل خود را به Kaggle ارسال کنید تا ببینید چگونه در میان سایر شرکت‌کنندگان رتبه‌بندی می‌شود.\n",
"\n",
"ما با بارگذاری مجموعه داده MNIST شروع می‌کنیم:\n"
]
@ -693,7 +695,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"چون پرسپترون یک دسته‌بند دودویی است، مسئله خود را به شناسایی تنها دو رقم محدود خواهیم کرد. تابع زیر آرایه‌های نمونه مثبت و منفی را با دو رقم داده‌شده پر می‌کند (و همچنین نمونه‌هایی از آن ارقام را برای وضوح نمایش می‌دهد).\n"
"زیرا پرسپترون یک طبقه‌بند دودویی است، ما مسئله خود را به شناسایی تنها دو رقم محدود خواهیم کرد. تابع زیر آرایه‌های نمونه مثبت و منفی را با دو رقم داده‌شده پر می‌کند (و همچنین نمونه‌هایی از آن ارقام را برای وضوح نشان می‌دهد).\n"
]
},
{
@ -829,11 +831,11 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"لطفاً توجه کنید که دقت به سرعت تقریباً به ۱۰۰٪ می‌رسد.\n",
"لطفاً توجه کنید که دقت خیلی سریع به تقریباً ۱۰۰٪ می‌رسد.\n",
"\n",
"لطفاً اسلایدر را به موقعیتی نزدیک به انتهای آموزش حرکت دهید و ماتریس وزن نمایش داده شده در سمت چپ را مشاهده کنید. این ماتریس به شما کمک می‌کند تا درک کنید که پرسپترون چگونه کار می‌کند. شما می‌توانید مقادیر وزن بالا را در وسط میدان مشاهده کنید که به پیکسل‌هایی مربوط می‌شود که معمولاً برای رقم ۱ وجود دارند، و مقادیر منفی پایین در کناره‌ها، جایی که بخش‌هایی از رقم ۰ قرار دارند. بنابراین، اگر رقمی که به پرسپترون ارائه می‌شود واقعاً ۱ باشد، بخش میانی آن با مقادیر بالا ضرب می‌شود و نتیجه مثبت تولید می‌کند. برعکس، زمانی که پرسپترون رقم ۰ را مشاهده می‌کند، پیکسل‌های مربوطه با اعداد منفی ضرب می‌شوند.\n",
"لطفاً اسلایدر را به موقعیتی نزدیک به انتهای آموزش حرکت دهید و ماتریس وزن نمایش داده شده در سمت چپ را مشاهده کنید. این ماتریس به شما کمک می‌کند تا بفهمید پرسپترون چگونه کار می‌کند. می‌توانید مقادیر وزن بالا را در وسط میدان ببینید که مربوط به پیکسل‌هایی است که معمولاً برای رقم ۱ وجود دارند، و مقادیر منفی پایین در کناره‌ها، جایی که بخش‌هایی از رقم ۰ قرار دارند. بنابراین، اگر رقمی که به پرسپترون ارائه شده واقعاً ۱ باشد، بخش میانی آن با مقادیر بالا ضرب می‌شود و نتیجه مثبت تولید می‌کند. برعکس، وقتی پرسپترون رقم ۰ را مشاهده می‌کند، پیکسل‌های مربوطه با اعداد منفی ضرب می‌شوند.\n",
"\n",
"> ممکن است متوجه شوید که اگر به پرسپترون یک رقم ۱ بدهیم که کمی به صورت افقی جابه‌جا شده باشد، به طوری که پیکسل‌های آن در جایی قرار گیرند که بخش‌های عمودی رقم ۰ هستند، ممکن است نتیجه نادرست دریافت کنیم. از آنجا که ماهیت مجموعه داده MNIST ما به گونه‌ای است که همه ارقام به صورت متمرکز و به درستی موقعیت‌یابی شده‌اند، پرسپترون برای تمایز بین ارقام به این ویژگی تکیه می‌کند.\n",
"> ممکن است متوجه شوید که اگر به پرسپترون یک رقم ۱ بدهیم که کمی به صورت افقی جابه‌جا شده باشد، به طوری که پیکسل‌های آن در جایی قرار گیرند که بخش‌های عمودی رقم ۰ هستند، ممکن است نتیجه اشتباه دریافت کنیم. از آنجا که ماهیت مجموعه داده MNIST به گونه‌ای است که همه ارقام به‌طور مرکزی و به‌درستی قرار گرفته‌اند، پرسپترون برای تمایز بین ارقام به این ویژگی تکیه می‌کند.\n",
"\n",
"حالا بیایید ارقام مختلف را امتحان کنیم:\n"
]
@ -911,11 +913,11 @@
"source": [
"## بحث\n",
"\n",
"به دلایلی، ۲ و ۵ به این راحتی از هم جدا نمی‌شوند. حتی با وجود اینکه دقت نسبتاً بالایی (بیش از ۸۵٪) داریم، به وضوح می‌بینیم که پرسپترون در یک نقطه از یادگیری باز می‌ماند.\n",
"به دلایلی، جدا کردن اعداد ۲ و ۵ به راحتی ممکن نیست. با اینکه دقت نسبتاً بالایی (بیش از ۸۵٪) به دست می‌آوریم، به وضوح می‌توانیم ببینیم که پرسپترون در یک نقطه از یادگیری باز می‌ماند.\n",
"\n",
"برای درک دلیل این اتفاق، می‌توانیم از [تحلیل مؤلفه‌های اصلی](https://en.wikipedia.org/wiki/Principal_component_analysis) (PCA) استفاده کنیم. این یک تکنیک یادگیری ماشین است که برای کاهش ابعاد مجموعه داده‌های ورودی به کار می‌رود، به گونه‌ای که بهترین جداسازی بین کلاس‌ها حاصل شود.\n",
"برای فهمیدن دلیل این اتفاق، می‌توانیم از [تحلیل مؤلفه اصلی](https://en.wikipedia.org/wiki/Principal_component_analysis) (PCA) استفاده کنیم. این یک تکنیک یادگیری ماشین است که برای کاهش ابعاد مجموعه داده‌های ورودی به کار می‌رود، به گونه‌ای که بهترین جداسازی بین کلاس‌ها حاصل شود.\n",
"\n",
"در مورد ما، یک تصویر ورودی دارای ۷۸۴ پیکسل (ویژگی‌های ورودی) است و می‌خواهیم از PCA استفاده کنیم تا تعداد پارامترها را به ۲ کاهش دهیم، به طوری که بتوانیم آن‌ها را روی نمودار رسم کنیم. این دو پارامتر ترکیبی خطی از ویژگی‌های اصلی خواهند بود و می‌توان این فرآیند را به عنوان \"چرخاندن\" فضای اصلی ۷۸۴ بعدی و مشاهده تصویر آن در فضای دوبعدی در نظر گرفت، تا زمانی که بهترین نمایی که کلاس‌ها را جدا می‌کند به دست آید.\n"
"در مورد ما، یک تصویر ورودی دارای ۷۸۴ پیکسل (ویژگی‌های ورودی) است و می‌خواهیم از PCA استفاده کنیم تا تعداد پارامترها را فقط به ۲ کاهش دهیم، به طوری که بتوانیم آن‌ها را روی نمودار رسم کنیم. این دو پارامتر ترکیبی خطی از ویژگی‌های اصلی خواهند بود و می‌توانیم این فرآیند را به عنوان \"چرخاندن\" فضای ۷۸۴ بعدی اصلی و مشاهده تصویر آن در فضای دو بعدی در نظر بگیریم، تا بهترین نمایی که کلاس‌ها را جدا می‌کند به دست آوریم.\n"
]
},
{
@ -1025,14 +1027,14 @@
}
},
"source": [
"همان‌طور که می‌بینید، 0 و 1 را می‌توان به‌وضوح با یک خط مستقیم از هم جدا کرد. این نشان می‌دهد که در فضای اصلی 784 بعدی، نقاط مربوط به ارقام نیز به‌صورت خطی قابل تفکیک هستند. اما در مورد 2 و 5، نمی‌توانیم یک تصویرسازی مناسب پیدا کنیم که ارقام را به‌وضوح از هم جدا کند، و به همین دلیل در برخی موارد طبقه‌بندی اشتباه رخ می‌دهد.\n",
"همان‌طور که می‌بینید، 0 و 1 به‌وضوح با یک خط مستقیم از هم جدا می‌شوند. این نشان می‌دهد که در فضای اصلی 784 بعدی، نقاط مربوط به ارقام نیز به‌صورت خطی قابل تفکیک هستند. اما در مورد ارقام 2 و 5، نمی‌توانیم یک تصویرسازی مناسب پیدا کنیم که این ارقام را به‌وضوح از هم جدا کند، و به همین دلیل در برخی موارد خطای طبقه‌بندی رخ می‌دهد.\n",
"\n",
"> در ادامه این دوره یاد خواهیم گرفت که چگونه با استفاده از شبکه‌های عصبی، طبقه‌بندهای غیرخطی ایجاد کنیم و با مشکل عدم تراز صحیح ارقام مقابله کنیم. به‌زودی به دقت بالای 99٪ در طبقه‌بندی ارقام MNIST خواهیم رسید، در حالی که آن‌ها را به 10 کلاس مختلف تقسیم می‌کنیم.\n",
"> در ادامه این دوره یاد خواهیم گرفت که چگونه با استفاده از شبکه‌های عصبی، طبقه‌بندهای غیرخطی ایجاد کنیم و با مشکل ناهماهنگی ارقام مقابله کنیم. به‌زودی به دقتی بالای 99% در طبقه‌بندی ارقام MNIST خواهیم رسید، در حالی که این ارقام را به 10 کلاس مختلف تقسیم می‌کنیم.\n",
"\n",
"## نکات کلیدی\n",
"\n",
"* ما با ساده‌ترین معماری شبکه عصبی - پرسپترون تک‌لایه - آشنا شدیم.\n",
"* پرسپترون را \"دستی\" پیاده‌سازی کردیم، با استفاده از یک روش آموزشی ساده مبتنی بر گرادیان نزولی.\n",
"* پرسپترون را \"به‌صورت دستی\" پیاده‌سازی کردیم، با استفاده از یک روش آموزشی ساده مبتنی بر گرادیان نزولی.\n",
"* با وجود سادگی، پرسپترون تک‌لایه می‌تواند مسائل نسبتاً پیچیده‌ای مانند شناسایی ارقام دست‌نویس را حل کند.\n",
"* پرسپترون تک‌لایه یک طبقه‌بند خطی است و بنابراین همان قدرت طبقه‌بندی رگرسیون لجستیک را ارائه می‌دهد.\n",
"* در فضای نمونه، پرسپترون می‌تواند دو کلاس از داده‌های ورودی را با استفاده از یک ابرصفحه از هم جدا کند.\n"
@ -1044,14 +1046,14 @@
"source": [
"## اعتبارها\n",
"\n",
"این نوت‌بوک بخشی از [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners) است و توسط [دمیتری سوشنیکوف](http://soshnikov.com) تهیه شده است. این نوت‌بوک از کارگاه شبکه‌های عصبی در Microsoft Research Cambridge الهام گرفته شده است. بخشی از کدها و مواد تصویری از ارائه‌های [کاتیا هافمن](https://www.microsoft.com/en-us/research/people/kahofman/)، [متیو جانسون](https://www.microsoft.com/en-us/research/people/matjoh/) و [ریوتو تومیئوکا](https://www.microsoft.com/en-us/research/people/ryoto/) گرفته شده‌اند و همچنین از مخزن [NeuroWorkshop](http://github.com/shwars/NeuroWorkshop) استفاده شده است.\n"
"این دفترچه بخشی از [برنامه درسی AI برای مبتدیان](http://github.com/microsoft/ai-for-beginners) است و توسط [دمیتری سوشنیکوف](http://soshnikov.com) تهیه شده است. این دفترچه از کارگاه شبکه‌های عصبی در Microsoft Research Cambridge الهام گرفته شده است. بخشی از کدها و مواد تصویری از ارائه‌های [کاتیا هافمن](https://www.microsoft.com/en-us/research/people/kahofman/)، [متیو جانسون](https://www.microsoft.com/en-us/research/people/matjoh/) و [ریوتو تومیوکا](https://www.microsoft.com/en-us/research/people/ryoto/) گرفته شده‌اند و همچنین از مخزن [NeuroWorkshop](http://github.com/shwars/NeuroWorkshop) استفاده شده است.\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**سلب مسئولیت**: \nاین سند با استفاده از سرویس ترجمه هوش مصنوعی [Co-op Translator](https://github.com/Azure/co-op-translator) ترجمه شده است. در حالی که ما تلاش می‌کنیم دقت را حفظ کنیم، لطفاً توجه داشته باشید که ترجمه‌های خودکار ممکن است شامل خطاها یا نادقتی‌ها باشند. سند اصلی به زبان بومی آن باید به عنوان منبع معتبر در نظر گرفته شود. برای اطلاعات حساس، ترجمه حرفه‌ای انسانی توصیه می‌شود. ما هیچ مسئولیتی در قبال سوءتفاهم‌ها یا تفسیرهای نادرست ناشی از استفاده از این ترجمه نداریم.\n"
"\n---\n\n**سلب مسئولیت**: \nاین سند با استفاده از سرویس ترجمه هوش مصنوعی [Co-op Translator](https://github.com/Azure/co-op-translator) ترجمه شده است. در حالی که ما تلاش می‌کنیم دقت را حفظ کنیم، لطفاً توجه داشته باشید که ترجمه‌های خودکار ممکن است شامل خطاها یا نادرستی‌ها باشند. سند اصلی به زبان اصلی آن باید به عنوان منبع معتبر در نظر گرفته شود. برای اطلاعات حساس، ترجمه حرفه‌ای انسانی توصیه می‌شود. ما مسئولیتی در قبال سوء تفاهم‌ها یا تفسیرهای نادرست ناشی از استفاده از این ترجمه نداریم.\n"
]
}
],
@ -1080,8 +1082,8 @@
"start_slideshow_at": "selected"
},
"coopTranslator": {
"original_hash": "914fc55f59efc7e17b8130d4033ac617",
"translation_date": "2025-08-31T16:35:24+00:00",
"original_hash": "d67e5b54ba20b507aa88d71aa3d042d8",
"translation_date": "2025-10-03T13:08:50+00:00",
"source_file": "lessons/3-NeuralNetworks/03-Perceptron/Perceptron.ipynb",
"language_code": "fa"
}

View File

@ -11,11 +11,11 @@
"source": [
"## Perceptron\n",
"\n",
"> Tämä muistikirja on osa [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners). Vieraile repositoriossa saadaksesi täydellisen oppimateriaalikokoelman.\n",
"> Tämä muistikirja on osa [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners). Käy repositoriossa saadaksesi täydellisen oppimateriaalien kokoelman.\n",
"\n",
"Kuten olemme keskustelleet, perceptron mahdollistaa **binääriluokitteluongelman** ratkaisemisen, eli syöte-esimerkkien luokittelun kahteen luokkaan - voimme kutsua niitä **positiiviseksi** ja **negatiiviseksi**.\n",
"\n",
"Aloitetaan ensin tuomalla tarvittavat kirjastot.\n"
"Aloitetaan ensin tarvittavien kirjastojen tuonnilla.\n"
]
},
{
@ -49,7 +49,7 @@
"source": [
"## Leikkiongelma\n",
"\n",
"Aloitetaan yksinkertaisella ongelmalla, jossa meillä on kaksi syötemuuttujaa. Esimerkiksi lääketieteessä saatamme haluta luokitella kasvaimet hyvänlaatuisiksi ja pahanlaatuisiksi niiden koon ja iän perusteella.\n",
"Aloitetaan yksinkertaisella leikkiongelmalla, jossa meillä on kaksi syötemuuttujaa. Esimerkiksi lääketieteessä saatamme haluta luokitella kasvaimet hyvänlaatuisiksi ja pahanlaatuisiksi niiden koon ja iän perusteella.\n",
"\n",
"Luomme satunnaisen luokitteludatan käyttämällä SciKit Learn -kirjaston `make_classification`-funktiota:\n"
]
@ -95,7 +95,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Piirretään myös datasetti:\n"
"Plotataan myös datasetti:\n"
]
},
{
@ -152,9 +152,9 @@
}
},
"source": [
"## Perceptron\n",
"## Perceptroni\n",
"\n",
"Koska perceptron on binaariluokitin, jokaiselle syötevektorille $x$ perceptronin tuottama ulostulo on joko +1 tai -1 riippuen luokasta. Ulostulo lasketaan kaavalla\n",
"Koska perceptroni on binääriluokitin, jokaiselle syötevektorille $x$ perceptronimme tuottaa joko +1 tai -1 riippuen luokasta. Tulosta lasketaan kaavalla\n",
"\n",
"$$y(\\mathbf{x}) = f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x})$$\n",
"\n",
@ -166,7 +166,7 @@
" \\end{cases} \\\\\n",
"$$\n",
"\n",
"Kuitenkin yleisessä lineaarisessa mallissa tulisi olla myös bias, eli ihanteellisesti meidän tulisi laskea $y$ muodossa $y=f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}+\\mathbf{b})$. Mallin yksinkertaistamiseksi voimme poistaa tämän bias-termin lisäämällä syöteominaisuuksiin yhden lisäulottuvuuden, joka on aina arvoltaan 1:\n"
"Kuitenkin yleisessä lineaarisessa mallissa tulisi olla myös bias-termi, eli ihanteellisesti meidän tulisi laskea $y$ muodossa $y=f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}+\\mathbf{b})$. Mallimme yksinkertaistamiseksi voimme poistaa tämän bias-termin lisäämällä yhden ulottuvuuden syöteominaisuuksiimme, joka on aina arvoltaan 1:\n"
]
},
{
@ -206,11 +206,11 @@
"source": [
"## Koulutusalgoritmi\n",
"\n",
"Jotta voimme kouluttaa perceptronin, meidän täytyy löytää painot $\\mathbf{w}$, jotka minimoivat virheen. Virhe määritellään **perceptronin kriteerin** avulla:\n",
"Jotta voimme kouluttaa perceptronin, meidän täytyy löytää painot $\\mathbf{w}$, jotka minimoivat virheen. Virhe määritellään käyttäen **perceptronin kriteeriä**:\n",
"\n",
"$$E(\\mathbf{w}) = -\\sum_{n \\in \\mathcal{M}}\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}_{n}t_{n}$$\n",
" \n",
" * $t_{n} \\in \\{-1, +1\\}$ negatiivisille ja positiivisille koulutusnäytteille, vastaavasti\n",
" * $t_{n} \\in \\{-1, +1\\}$ negatiivisille ja positiivisille opetusnäytteille, vastaavasti\n",
" * $\\mathcal{M}$ - väärin luokiteltujen esimerkkien joukko\n",
" \n",
"Käytämme **gradienttimenetelmää**. Aloittaen satunnaisilla alkuarvoilla $\\mathbf{w}^{(0)}$, säädämme painoja jokaisella koulutusaskeleella virheen $E$ gradientin avulla:\n",
@ -271,7 +271,9 @@
{
"cell_type": "markdown",
"metadata": {},
"source": []
"source": [
"Nyt suoritetaan koulutus aineistollamme:\n"
]
},
{
"cell_type": "code",
@ -309,9 +311,9 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Kuten huomaat, alkuperäinen tarkkuus on noin 50 %, mutta se kasvaa nopeasti korkeampiin arvoihin, lähelle 90 %.\n",
"Kuten näet, alkuperäinen tarkkuus on noin 50 %, mutta se kasvaa nopeasti korkeampiin arvoihin, lähelle 90 %.\n",
"\n",
"Visualisoidaan, miten luokat erottuvat toisistaan. Luokittelufunktiomme näyttää tältä: $\\mathbf{w}^Tx$, ja se on suurempi kuin 0 yhdelle luokalle ja pienempi kuin 0 toiselle. Näin ollen luokkien erottava viiva määritellään yhtälöllä $\\mathbf{w}^Tx = 0$. Koska meillä on vain kaksi ulottuvuutta $x_0$ ja $x_1$, viivan yhtälö olisi $w_0x_0+w_1x_1+w_2 = 0$ (muista, että olemme eksplisiittisesti määritelleet ylimääräisen ulottuvuuden $x_2=1$). Piirretään tämä viiva:\n"
"Visualisoidaan, miten luokat erotetaan toisistaan. Luokittelufunktiomme näyttää tältä: $\\mathbf{w}^Tx$, ja se on suurempi kuin 0 yhdelle luokalle ja pienempi kuin 0 toiselle. Näin ollen luokkien erottava viiva määritellään yhtälöllä $\\mathbf{w}^Tx = 0$. Koska meillä on vain kaksi ulottuvuutta $x_0$ ja $x_1$, viivan yhtälö olisi $w_0x_0+w_1x_1+w_2 = 0$ (muista, että olemme nimenomaisesti määritelleet ylimääräisen ulottuvuuden $x_2=1$). Piirretään tämä viiva:\n"
]
},
{
@ -379,7 +381,7 @@
"source": [
"## Arvioi testidatalla\n",
"\n",
"Alussa olemme erottaneet osan datasta testidatasettiin. Katsotaan, kuinka tarkka luokittelijamme on tällä testidatasetillä. Tätä varten laajennamme testidatasetin ylimääräisellä ulottuvuudella, kerromme painomatriisilla ja varmistamme, että saatu arvo on samanmerkkinen kuin tunniste (+1 tai -1). Tämän jälkeen laskemme yhteen kaikki totuusarvot ja jaamme testinäytteen pituudella saadaksemme tarkkuuden:\n"
"Alussa olemme erottaneet osan datasta testidataksi. Katsotaan, kuinka tarkka luokittimemme on tällä testidatalla. Tätä varten laajennamme testidatan ylimääräisellä ulottuvuudella, kerromme painomatriisilla ja varmistamme, että saatu arvo on samanmerkkinen kuin tunniste (+1 tai -1). Tämän jälkeen laskemme yhteen kaikki totuusarvot ja jaamme testinäytteen pituudella saadaksemme tarkkuuden:\n"
]
},
{
@ -420,7 +422,7 @@
"source": [
"## Havainnoimassa koulutusprosessia\n",
"\n",
"Olemme aiemmin nähneet, kuinka tarkkuus heikkenee koulutuksen aikana. Olisi mielenkiintoista nähdä, miten erottelulinja käyttäytyy koulutuksen aikana. Alla oleva koodi visualisoi kaiken yhteen graafiin, ja sinun pitäisi pystyä siirtämään liukusäädintä \"aikamatkailun\" avulla koulutusprosessin läpi.\n"
"Olemme aiemmin nähneet, kuinka tarkkuus heikkenee koulutuksen aikana. Olisi mielenkiintoista nähdä, miten erotusviiva käyttäytyy koulutuksen aikana. Alla oleva koodi visualisoi kaiken yhdellä graafilla, ja sinun pitäisi pystyä siirtämään liukusäädintä \"aikamatkailun\" avulla koulutusprosessin läpi.\n"
]
},
{
@ -527,9 +529,9 @@
"source": [
"## Perceptronin rajoitukset\n",
"\n",
"Kuten yllä on nähty, perceptron on **lineaarinen luokittelija**. Se pystyy erottamaan kaksi luokkaa hyvin, jos ne ovat **lineaarisesti erotettavissa**, eli ne voidaan erottaa suoralla viivalla. Muussa tapauksessa perceptronin koulutusprosessi ei tule konvergoimaan.\n",
"Kuten yllä on nähty, perceptron on **lineaarinen luokittelija**. Se pystyy erottamaan kaksi luokkaa hyvin, jos ne ovat **lineaarisesti erotettavissa**, eli ne voidaan erottaa suoralla viivalla. Muussa tapauksessa perceptronin koulutusprosessi ei saavuta konvergenssia.\n",
"\n",
"Yksi ilmeisimmistä esimerkeistä ongelmasta, jota perceptron ei voi ratkaista, on niin sanottu **XOR-ongelma**. Haluamme, että perceptron oppii XOR-loogisen funktion, jonka totuustaulukko näyttää tältä:\n",
"Yksi ilmeisimmistä esimerkeistä ongelmasta, jota perceptron ei voi ratkaista, on niin sanottu **XOR-ongelma**. Haluamme, että perceptron oppii XOR-loogisen funktion, jolla on seuraava totuustaulukko:\n",
"\n",
"| | 0 | 1 |\n",
"|---|---|---|\n",
@ -605,13 +607,13 @@
"source": [
"Kuten yllä olevasta kaaviosta näkyy, tarkkuus ei koskaan ylitä 75 %, koska on mahdotonta piirtää suoraa viivaa siten, että kaikki mahdolliset esimerkit saadaan oikein.\n",
"\n",
"XOR-ongelma on klassinen esimerkki perceptronin rajoituksista, ja Marvin Minsky sekä Seymour Papert toivat sen esille vuonna 1969 kirjassaan [Perceptrons](https://en.wikipedia.org/wiki/Perceptrons_(book)). Tämä havainto rajoitti neuroverkkojen tutkimusta lähes 10 vuoden ajan, vaikka - kuten näemme kurssimme seuraavassa osiossa - monikerroksiset perceptronit pystyvät ratkaisemaan tällaisia ongelmia.\n",
"XOR-ongelma on klassinen esimerkki perceptronin rajoituksista, ja Marvin Minsky ja Seymour Papert toivat sen esille vuonna 1969 kirjassaan [Perceptrons](https://en.wikipedia.org/wiki/Perceptrons_(book)). Tämä havainto rajoitti tutkimusta neuroverkkojen alueella lähes 10 vuoden ajan, vaikka - kuten näemme kurssimme seuraavassa osiossa - monikerroksiset perceptronit pystyvät täysin ratkaisemaan tällaisia ongelmia.\n",
"\n",
"## Monimutkainen esimerkki - MNIST\n",
"\n",
"Vaikka perceptron ei pysty ratkaisemaan XOR-ongelmaa, se voi ratkaista monia paljon monimutkaisempia ongelmia, kuten käsinkirjoitettujen merkkien tunnistamisen.\n",
"\n",
"Koneoppimisen hallitsemisessa usein käytetty datasetti on nimeltään [MNIST](https://en.wikipedia.org/wiki/MNIST_database). Sen on luonut Modified National Institute of Standards and Technology, ja se sisältää 60000 käsinkirjoitettua numeroa harjoitusjoukossa, jotka on kerätty noin 250 opiskelijalta ja instituutin työntekijältä. Lisäksi on olemassa testidatasetti, joka sisältää 10000 numeroa, kerätty eri henkilöiltä.\n",
"Datasetti, jota käytetään usein koneoppimisen hallitsemisessa, on nimeltään [MNIST](https://en.wikipedia.org/wiki/MNIST_database). Sen on luonut Modified National Institute of Standards and Technology, ja se sisältää 60000 käsinkirjoitetun numeron harjoitusjoukon, joka on kerätty noin 250 opiskelijalta ja instituutin työntekijältä. Lisäksi on olemassa testidatasetti, joka sisältää 10000 numeroa, kerätty eri henkilöiltä.\n",
"\n",
"Kaikki numerot on esitetty harmaasävykuvina, joiden koko on 28x28 pikseliä.\n",
"\n",
@ -642,7 +644,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Nyt piirretään datasetti:\n"
"Piirretään nyt datasetti:\n"
]
},
{
@ -693,7 +695,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Koska perceptroni on binääriluokitin, rajoitamme ongelmamme vain kahden numeron tunnistamiseen. Alla oleva funktio täyttää positiiviset ja negatiiviset näytearvot kahdella annetulla numerolla (ja näyttää myös näytteet näistä numeroista selkeyden vuoksi).\n"
"Koska perceptroni on binääriluokitin, rajoitamme ongelmamme tunnistamaan vain kaksi numeroa. Alla oleva funktio täyttää positiiviset ja negatiiviset näytearvot kahdella annetulla numerolla (ja näyttää myös näytteitä näistä numeroista selkeyden vuoksi).\n"
]
},
{
@ -829,11 +831,11 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Huomaa, kuinka tarkkuus nousee lähes 100 %:iin hyvin nopeasti.\n",
"Huomaa, kuinka tarkkuus nousee lähes 100 %:iin erittäin nopeasti.\n",
"\n",
"Siirrä liukusäädintä johonkin kohtaan harjoittelun loppupuolella ja tarkkaile vasemmalla näkyvää painomatriisia. Tämä matriisi auttaa sinua ymmärtämään, miten perceptron toimii. Voit nähdä korkeat painoarvot kentän keskellä, jotka vastaavat pikseleitä, jotka ovat tyypillisesti läsnä numerolle 1, ja matalat negatiiviset arvot reunoilla, joissa ovat numeron 0 osat. Joten, jos perceptronille esitetty numero on todellisuudessa 1, sen keskiosa kerrotaan korkeilla arvoilla, mikä tuottaa positiivisen tuloksen. Toisaalta, kun perceptron havaitsee numeron 0, vastaavat pikselit kerrotaan negatiivisilla luvuilla.\n",
"Siirrä liukusäädintä kohti harjoittelun loppua ja tarkastele vasemmalla näkyvää painomatriisia. Tämä matriisi auttaa sinua ymmärtämään, miten perceptroni toimii. Voit nähdä korkeat painoarvot kentän keskellä, jotka vastaavat pikseleitä, jotka ovat tyypillisesti läsnä numerolle 1, ja matalat negatiiviset arvot reunoilla, joissa numeron 0 osat sijaitsevat. Jos perceptronille esitetty numero on todellisuudessa 1, sen keskiosa kerrotaan korkeilla arvoilla, mikä tuottaa positiivisen tuloksen. Toisaalta, kun perceptroni havaitsee numeron 0, vastaavat pikselit kerrotaan negatiivisilla arvoilla.\n",
"\n",
"> Saatat huomata, että jos annamme perceptronille numeron 1, joka on hieman siirtynyt vaakasuunnassa niin, että sen pikselit ovat kohdissa, joissa on numeron 0 pystysuoria osia, voimme saada virheellisen tuloksen. Koska MNIST-datasetin luonne on sellainen, että kaikki numerot on keskitetty ja sijoitettu oikein, perceptron luottaa tähän erottaakseen numerot toisistaan.\n",
"> Saatat huomata, että jos annamme perceptronille numeron 1, joka on hieman siirtynyt vaakasuunnassa niin, että sen pikselit osuvat kohtaan, jossa numeron 0 pystysuorat osat ovat, voimme saada virheellisen tuloksen. MNIST-datasetin luonne on sellainen, että kaikki numerot ovat keskitettyjä ja sijoitettu oikein, ja perceptroni perustuu tähän erottaakseen numerot toisistaan.\n",
"\n",
"Kokeillaan nyt eri numeroita:\n"
]
@ -911,11 +913,11 @@
"source": [
"## Keskustelu\n",
"\n",
"Jostain syystä 2 ja 5 eivät ole yhtä helposti erotettavissa. Vaikka saavutamme suhteellisen korkean tarkkuuden (yli 85 %), voimme selvästi nähdä, kuinka perceptron lopettaa oppimisen jossain vaiheessa.\n",
"Jostain syystä numerot 2 ja 5 eivät ole yhtä helposti erotettavissa. Vaikka saavutamme suhteellisen korkean tarkkuuden (yli 85 %), voimme selvästi nähdä, kuinka perceptron lopettaa oppimisen jossain vaiheessa.\n",
"\n",
"Ymmärtääksemme, miksi näin tapahtuu, voimme kokeilla käyttää [Principal Component Analysis](https://en.wikipedia.org/wiki/Principal_component_analysis) (PCA). Se on koneoppimistekniikka, jota käytetään syötedatan ulottuvuuden pienentämiseen siten, että luokkien välinen erotettavuus saadaan mahdollisimman hyväksi.\n",
"Ymmärtääksemme, miksi näin tapahtuu, voimme kokeilla käyttää [Principal Component Analysis](https://en.wikipedia.org/wiki/Principal_component_analysis) (PCA). Se on koneoppimistekniikka, jota käytetään syötedatan ulottuvuuden pienentämiseen siten, että luokkien välinen erotettavuus maksimoituu.\n",
"\n",
"Meidän tapauksessamme syötekuvassa on 784 pikseliä (syöteominaisuuksia), ja haluamme käyttää PCA:ta vähentääksemme parametrien määrän kahteen, jotta voimme piirtää ne graafiin. Nämä kaksi parametriä olisivat alkuperäisten ominaisuuksien lineaarinen yhdistelmä, ja voimme nähdä tämän prosessin ikään kuin \"kiertäisimme\" alkuperäistä 784-ulotteista avaruuttamme ja tarkkailisimme sen projektioita 2D-avaruuteen, kunnes saamme parhaan näkymän, joka erottaa luokat.\n"
"Meidän tapauksessamme syötekuvassa on 784 pikseliä (syöteominaisuuksia), ja haluamme käyttää PCA:ta vähentääksemme parametrien määrän kahteen, jotta voimme piirtää ne graafiin. Nämä kaksi parametria olisivat alkuperäisten ominaisuuksien lineaarinen yhdistelmä, ja voimme nähdä tämän prosessin ikään kuin \"kiertäisimme\" alkuperäistä 784-ulotteista avaruutta ja tarkkailisimme sen projektioita 2D-avaruuteen, kunnes saamme parhaan näkymän, joka erottaa luokat.\n"
]
},
{
@ -1025,15 +1027,15 @@
}
},
"source": [
"Kuten näet, 0 ja 1 voidaan selvästi erottaa suoralla viivalla. Tämä osoittaa, että alkuperäisessä 784-ulotteisessa avaruudessa numerot vastaavat pisteet ovat myös lineaarisesti erotettavissa. Tapauksessa 2 ja 5 emme kuitenkaan löydä hyvää projektioita, joka erottaisi numerot selkeästi, ja siksi on joitakin virheellisen luokittelun tapauksia.\n",
"Kuten näet, 0 ja 1 voidaan selvästi erottaa suoralla viivalla. Tämä osoittaa, että alkuperäisessä 784-ulotteisessa avaruudessa numeroita vastaavat pisteet ovat myös lineaarisesti erotettavissa. Tapauksessa 2 ja 5 emme kuitenkaan löydä hyvää projektioita, joka erottaisi numerot selkeästi, ja siksi joissakin tapauksissa tapahtuu virheellistä luokittelua.\n",
"\n",
"> Myöhemmin tällä kurssilla opimme luomaan epälineaarisia luokittelijoita käyttämällä neuroverkkoja ja käsittelemään ongelmaa, jossa numerot eivät ole kunnolla linjassa. Hyvin pian saavutamme yli 99 % tarkkuuden MNIST-numeroiden luokittelussa, kun luokittelemme ne 10 eri luokkaan.\n",
"\n",
"## Yhteenveto\n",
"\n",
" * Olemme oppineet yksinkertaisimman neuroverkon arkkitehtuurin - yhden kerroksen perceptronin.\n",
" * Olemme toteuttaneet perceptronin \"käsin\" käyttäen yksinkertaista koulutusmenetelmää, joka perustuu gradienttilaskentaan.\n",
" * Yksinkertaisuudestaan huolimatta yhden kerroksen perceptron pystyy ratkaisemaan melko monimutkaisia käsinkirjoitettujen numeroiden tunnistustehtäviä.\n",
" * Olemme oppineet yksinkertaisimmasta neuroverkon arkkitehtuurista - yhden kerroksen perceptronista.\n",
" * Olemme toteuttaneet perceptronin \"käsin\" käyttäen yksinkertaista gradienttimenetelmään perustuvaa harjoitusprosessia.\n",
" * Yksinkertaisuudestaan huolimatta yhden kerroksen perceptron pystyy ratkaisemaan melko monimutkaisia käsinkirjoitettujen numeroiden tunnistusongelmia.\n",
" * Yhden kerroksen perceptron on lineaarinen luokittelija, ja siksi sen luokittelukyky vastaa logistista regressiota.\n",
" * Näyteavaruudessa perceptron voi erottaa kaksi syöteaineiston luokkaa hyperpinnan avulla.\n"
]
@ -1044,14 +1046,14 @@
"source": [
"## Tekijätiedot\n",
"\n",
"Tämä muistikirja on osa [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners) -ohjelmaa, ja sen on laatinut [Dmitry Soshnikov](http://soshnikov.com). Se on saanut inspiraationsa Microsoft Research Cambridgen Neural Network Workshopista. Osa koodista ja havainnollistavista materiaaleista on otettu [Katja Hoffmann](https://www.microsoft.com/en-us/research/people/kahofman/), [Matthew Johnson](https://www.microsoft.com/en-us/research/people/matjoh/) ja [Ryoto Tomioka](https://www.microsoft.com/en-us/research/people/ryoto/) esityksistä sekä [NeuroWorkshop](http://github.com/shwars/NeuroWorkshop) -arkistosta.\n"
"Tämä muistikirja on osa [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners) -ohjelmaa, ja sen on laatinut [Dmitry Soshnikov](http://soshnikov.com). Se on saanut inspiraationsa Neural Network Workshop -työpajasta Microsoft Research Cambridgessa. Osa koodista ja havainnollistavista materiaaleista on peräisin [Katja Hoffmann](https://www.microsoft.com/en-us/research/people/kahofman/), [Matthew Johnson](https://www.microsoft.com/en-us/research/people/matjoh/) ja [Ryoto Tomioka](https://www.microsoft.com/en-us/research/people/ryoto/) esityksistä sekä [NeuroWorkshop](http://github.com/shwars/NeuroWorkshop) -arkistosta.\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Vastuuvapauslauseke**: \nTämä asiakirja on käännetty käyttämällä tekoälypohjaista käännöspalvelua [Co-op Translator](https://github.com/Azure/co-op-translator). Vaikka pyrimme tarkkuuteen, huomioithan, että automaattiset käännökset voivat sisältää virheitä tai epätarkkuuksia. Alkuperäinen asiakirja sen alkuperäisellä kielellä tulisi pitää ensisijaisena lähteenä. Kriittisen tiedon osalta suositellaan ammattimaista ihmiskäännöstä. Emme ole vastuussa väärinkäsityksistä tai virhetulkinnoista, jotka johtuvat tämän käännöksen käytöstä.\n"
"\n---\n\n**Vastuuvapauslauseke**: \nTämä asiakirja on käännetty käyttämällä tekoälypohjaista käännöspalvelua [Co-op Translator](https://github.com/Azure/co-op-translator). Vaikka pyrimme tarkkuuteen, huomioithan, että automaattiset käännökset voivat sisältää virheitä tai epätarkkuuksia. Alkuperäistä asiakirjaa sen alkuperäisellä kielellä tulisi pitää ensisijaisena lähteenä. Kriittisen tiedon osalta suositellaan ammattimaista ihmiskäännöstä. Emme ole vastuussa väärinkäsityksistä tai virhetulkinnoista, jotka johtuvat tämän käännöksen käytöstä.\n"
]
}
],
@ -1080,8 +1082,8 @@
"start_slideshow_at": "selected"
},
"coopTranslator": {
"original_hash": "914fc55f59efc7e17b8130d4033ac617",
"translation_date": "2025-08-28T22:22:36+00:00",
"original_hash": "d67e5b54ba20b507aa88d71aa3d042d8",
"translation_date": "2025-10-03T13:32:19+00:00",
"source_file": "lessons/3-NeuralNetworks/03-Perceptron/Perceptron.ipynb",
"language_code": "fi"
}

View File

@ -11,11 +11,11 @@
"source": [
"## Perceptron\n",
"\n",
"> Ce notebook fait partie du [programme d'initiation à l'IA](http://github.com/microsoft/ai-for-beginners). Consultez le dépôt pour accéder à l'ensemble des supports pédagogiques.\n",
"> Ce notebook fait partie du [programme AI for Beginners](http://github.com/microsoft/ai-for-beginners). Consultez le dépôt pour l'ensemble complet des supports d'apprentissage.\n",
"\n",
"Comme nous l'avons vu, le perceptron permet de résoudre un **problème de classification binaire**, c'est-à-dire de classer des exemples d'entrée en deux catégories - que nous pouvons appeler **positive** et **négative**.\n",
"Comme nous l'avons discuté, le perceptron vous permet de résoudre un **problème de classification binaire**, c'est-à-dire de classer des exemples d'entrée en deux catégories - que nous pouvons appeler **positif** et **négatif**.\n",
"\n",
"Commençons par importer quelques bibliothèques nécessaires.\n"
"Tout d'abord, importons quelques bibliothèques nécessaires.\n"
]
},
{
@ -47,9 +47,9 @@
}
},
"source": [
"## Problème simple\n",
"## Problème Simplifié\n",
"\n",
"Pour commencer, abordons un problème simple, où nous avons deux caractéristiques d'entrée. Par exemple, en médecine, nous pourrions vouloir classer les tumeurs en bénignes et malignes, en fonction de leur taille et de leur âge.\n",
"Pour commencer, abordons un problème simplifié, où nous avons deux caractéristiques d'entrée. Par exemple, en médecine, nous pourrions vouloir classer les tumeurs en bénignes et malignes, en fonction de leur taille et de leur âge.\n",
"\n",
"Nous allons générer un ensemble de données de classification aléatoire en utilisant la fonction `make_classification` de la bibliothèque SciKit Learn :\n"
]
@ -154,7 +154,7 @@
"source": [
"## Perceptron\n",
"\n",
"Étant donné que le perceptron est un classificateur binaire, pour chaque vecteur d'entrée $x$, la sortie de notre perceptron sera soit +1, soit -1, en fonction de la classe. La sortie sera calculée à l'aide de la formule suivante :\n",
"Étant donné que le perceptron est un classificateur binaire, pour chaque vecteur d'entrée $x$, la sortie de notre perceptron sera soit +1, soit -1, selon la classe. La sortie sera calculée à l'aide de la formule suivante :\n",
"\n",
"$$y(\\mathbf{x}) = f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x})$$\n",
"\n",
@ -166,7 +166,7 @@
" \\end{cases} \\\\\n",
"$$\n",
"\n",
"Cependant, un modèle linéaire générique devrait également inclure un biais, c'est-à-dire qu'idéalement, nous devrions calculer $y$ comme $y=f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}+\\mathbf{b})$. Pour simplifier notre modèle, nous pouvons éliminer ce terme de biais en ajoutant une dimension supplémentaire à nos caractéristiques d'entrée, qui sera toujours égale à 1 :\n"
"Cependant, un modèle linéaire générique devrait également inclure un biais, c'est-à-dire que nous devrions idéalement calculer $y$ comme $y=f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}+\\mathbf{b})$. Pour simplifier notre modèle, nous pouvons éliminer ce terme de biais en ajoutant une dimension supplémentaire à nos caractéristiques d'entrée, qui vaut toujours 1 :\n"
]
},
{
@ -204,7 +204,7 @@
}
},
"source": [
"## Algorithme d'Apprentissage\n",
"## Algorithme d'entraînement\n",
"\n",
"Pour entraîner le perceptron, nous devons déterminer les poids $\\mathbf{w}$ qui minimiseront l'erreur. L'erreur est définie à l'aide du **critère du perceptron** :\n",
"\n",
@ -217,7 +217,7 @@
"\n",
"$$\\mathbf{w}^{\\tau + 1}=\\mathbf{w}^{\\tau} - \\eta \\nabla E(\\mathbf{w}) = \\mathbf{w}^{\\tau} + \\eta\\sum_{n \\in \\mathcal{M}}\\mathbf{x}_{n} t_{n}$$\n",
"\n",
"où $\\eta$ est un **taux d'apprentissage**, et $\\tau\\in\\mathbb{N}$ - le nombre d'itérations.\n",
"où $\\eta$ est un **taux d'apprentissage**, et $\\tau\\in\\mathbb{N}$ - nombre d'itérations.\n",
"\n",
"Définissons cet algorithme en Python :\n"
]
@ -271,7 +271,9 @@
{
"cell_type": "markdown",
"metadata": {},
"source": []
"source": [
"Maintenant, lançons l'entraînement sur notre ensemble de données :\n"
]
},
{
"cell_type": "code",
@ -309,7 +311,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Comme vous pouvez le constater, la précision initiale est d'environ 50 %, mais elle augmente rapidement pour atteindre des valeurs plus élevées proches de 90 %.\n",
"Comme vous pouvez le voir, la précision initiale est d'environ 50 %, mais elle augmente rapidement pour atteindre des valeurs proches de 90 %.\n",
"\n",
"Visualisons comment les classes sont séparées. Notre fonction de classification ressemble à $\\mathbf{w}^Tx$, et elle est supérieure à 0 pour une classe, et inférieure à 0 pour une autre. Ainsi, la ligne de séparation des classes est définie par $\\mathbf{w}^Tx = 0$. Étant donné que nous avons seulement deux dimensions $x_0$ et $x_1$, l'équation de la ligne serait $w_0x_0+w_1x_1+w_2 = 0$ (rappelez-vous que nous avons explicitement défini une dimension supplémentaire $x_2=1$). Traçons cette ligne :\n"
]
@ -379,7 +381,7 @@
"source": [
"## Évaluer sur le jeu de données de test\n",
"\n",
"Au départ, nous avons mis de côté certaines données pour constituer le jeu de données de test. Voyons à quel point notre classificateur est précis sur ce jeu de données de test. Pour ce faire, nous étendons également le jeu de données de test avec une dimension supplémentaire, multiplions par la matrice des poids, et nous assurons que la valeur obtenue a le même signe que l'étiquette (+1 ou -1). Ensuite, nous additionnons toutes les valeurs booléennes et divisons par la taille de l'échantillon de test pour obtenir la précision :\n"
"Au départ, nous avons mis de côté certaines données pour constituer le jeu de données de test. Voyons à quel point notre classificateur est précis sur ce jeu de données. Pour ce faire, nous étendons également le jeu de données de test avec une dimension supplémentaire, le multiplions par la matrice de poids, et nous assurons que la valeur obtenue a le même signe que l'étiquette (+1 ou -1). Ensuite, nous additionnons toutes les valeurs booléennes et les divisons par la taille de l'échantillon de test pour obtenir la précision :\n"
]
},
{
@ -420,7 +422,7 @@
"source": [
"## Observer le processus d'entraînement\n",
"\n",
"Nous avons vu précédemment comment la précision diminue pendant l'entraînement. Ce serait intéressant de voir comment la ligne de séparation évolue au cours de l'entraînement. Le code ci-dessous permettra de tout visualiser sur un seul graphique, et vous pourrez déplacer le curseur pour \"voyager dans le temps\" à travers le processus d'entraînement.\n"
"Nous avons vu précédemment comment la précision diminue pendant l'entraînement. Ce serait intéressant de voir comment la ligne de séparation évolue au cours de l'entraînement. Le code ci-dessous permettra de tout visualiser sur un seul graphique, et vous devriez pouvoir déplacer le curseur pour \"voyager dans le temps\" à travers le processus d'entraînement.\n"
]
},
{
@ -527,7 +529,7 @@
"source": [
"## Limitations du Perceptron\n",
"\n",
"Comme vous l'avez vu ci-dessus, le perceptron est un **classificateur linéaire**. Il peut distinguer efficacement deux classes si elles sont **linéairement séparables**, c'est-à-dire si elles peuvent être séparées par une ligne droite. Sinon, le processus d'entraînement du perceptron ne convergera pas.\n",
"Comme vous l'avez vu plus haut, le perceptron est un **classificateur linéaire**. Il peut bien distinguer entre deux classes si elles sont **linéairement séparables**, c'est-à-dire si elles peuvent être séparées par une ligne droite. Sinon, le processus d'entraînement du perceptron ne convergera pas.\n",
"\n",
"Un exemple évident d'un problème qui ne peut pas être résolu par un perceptron est le fameux **problème XOR**. Nous voulons que notre perceptron apprenne la fonction booléenne XOR, qui a la table de vérité suivante :\n",
"\n",
@ -605,13 +607,13 @@
"source": [
"Comme vous pouvez le voir sur le graphique ci-dessus, la précision ne dépasse jamais 75 %, car il est impossible de tracer une ligne droite de manière à classer correctement tous les exemples possibles.\n",
"\n",
"Le problème XOR est un exemple classique des limitations du perceptron, et il a été souligné par Marvin Minsky et Seymour Papert en 1969 dans leur livre [Perceptrons](https://en.wikipedia.org/wiki/Perceptrons_(book)). Cette observation a freiné la recherche dans le domaine des réseaux neuronaux pendant près de 10 ans, même si - comme nous le verrons dans la prochaine section de notre cours - les perceptrons multicouches sont parfaitement capables de résoudre de tels problèmes.\n",
"Le problème XOR est un exemple classique des limitations du perceptron, et il a été souligné par Marvin Minsky et Seymour Papert en 1969 dans leur livre [Perceptrons](https://en.wikipedia.org/wiki/Perceptrons_(book)). Cette observation a freiné les recherches dans le domaine des réseaux neuronaux pendant près de 10 ans, même si - comme nous le verrons dans la prochaine section de notre cours - les perceptrons multicouches sont parfaitement capables de résoudre de tels problèmes.\n",
"\n",
"## Exemple complexe - MNIST\n",
"\n",
"Bien que le perceptron ne puisse pas résoudre le problème XOR, il peut résoudre des problèmes beaucoup plus complexes, comme la reconnaissance de caractères manuscrits.\n",
"\n",
"Un ensemble de données souvent utilisé pour maîtriser l'apprentissage automatique s'appelle [MNIST](https://en.wikipedia.org/wiki/MNIST_database). Il a été créé par le Modified National Institute of Standards and Technology et contient un ensemble d'entraînement de 60 000 chiffres manuscrits, collectés auprès d'environ 250 étudiants et employés de l'institut. Il existe également un ensemble de test de 10 000 chiffres, collectés auprès d'individus différents.\n",
"Un ensemble de données souvent utilisé pour maîtriser l'apprentissage automatique s'appelle [MNIST](https://en.wikipedia.org/wiki/MNIST_database). Il a été créé par le National Institute of Standards and Technology modifié, et contient un ensemble d'entraînement de 60 000 chiffres manuscrits, collectés auprès d'environ 250 étudiants et employés de l'institut. Il existe également un ensemble de test de 10 000 chiffres, collectés auprès d'individus différents.\n",
"\n",
"Tous les chiffres sont représentés par des images en niveaux de gris de taille 28x28 pixels.\n",
"\n",
@ -829,13 +831,13 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Veuillez noter à quelle vitesse la précision atteint presque 100 %.\n",
"Veuillez noter que la précision atteint presque 100 % très rapidement.\n",
"\n",
"Veuillez déplacer le curseur vers une position proche de la fin de l'entraînement et observer la matrice de poids tracée à gauche. Cette matrice vous permettra de comprendre comment fonctionne réellement le perceptron. Vous pouvez voir les valeurs de poids élevées au centre du champ, qui correspondent aux pixels généralement présents pour le chiffre 1, et des valeurs négatives faibles sur les côtés, où se trouvent les parties du chiffre 0. Ainsi, si le chiffre présenté au perceptron est effectivement un 1, la partie centrale sera multipliée par des valeurs élevées, produisant un résultat positif. En revanche, lorsque le perceptron observe un 0, les pixels correspondants seront multipliés par des nombres négatifs.\n",
"Veuillez déplacer le curseur vers une position proche de la fin de l'entraînement et observez la matrice de poids affichée à gauche. Cette matrice vous permettra de comprendre comment fonctionne réellement le perceptron. Vous pouvez voir des valeurs de poids élevées au centre du champ, correspondant aux pixels généralement présents pour le chiffre 1, et des valeurs négatives faibles sur les côtés, là où se trouvent des parties du chiffre 0. Ainsi, si le chiffre présenté au perceptron est effectivement un 1, la partie centrale sera multipliée par des valeurs élevées, produisant un résultat positif. En revanche, lorsque le perceptron observe un 0, les pixels correspondants seront multipliés par des nombres négatifs.\n",
"\n",
"> Vous pouvez remarquer que si nous donnons à notre perceptron un chiffre 1 légèrement décalé horizontalement, de sorte que ses pixels occupent l'endroit où se trouvent les parties verticales du 0, nous pourrions obtenir un résultat incorrect. Étant donné que la nature de notre ensemble de données MNIST est telle que tous les chiffres sont centrés et positionnés correctement, le perceptron s'appuie sur cela pour distinguer les chiffres.\n",
"> Vous pourriez remarquer que si nous donnons à notre perceptron un chiffre 1 légèrement décalé horizontalement, de sorte que ses pixels occupent l'emplacement des parties verticales d'un 0, nous pourrions obtenir un résultat incorrect. Cela s'explique par la nature de notre jeu de données MNIST, où tous les chiffres sont centrés et correctement positionnés, et le perceptron s'appuie sur cette caractéristique pour distinguer les chiffres.\n",
"\n",
"Essayons maintenant différents chiffres :\n"
"Essayons maintenant avec différents chiffres :\n"
]
},
{
@ -911,11 +913,11 @@
"source": [
"## Discussion\n",
"\n",
"Pour une raison quelconque, 2 et 5 ne sont pas aussi facilement séparables. Même si nous obtenons une précision relativement élevée (au-dessus de 85 %), nous pouvons clairement voir que le perceptron cesse d'apprendre à un certain moment.\n",
"Pour une raison quelconque, 2 et 5 ne sont pas aussi facilement séparables. Même si nous obtenons une précision relativement élevée (supérieure à 85 %), on peut clairement voir que le perceptron cesse d'apprendre à un certain moment.\n",
"\n",
"Pour comprendre pourquoi cela se produit, nous pouvons essayer d'utiliser [l'Analyse en Composantes Principales](https://fr.wikipedia.org/wiki/Analyse_en_composantes_principales) (ACP). C'est une technique d'apprentissage automatique utilisée pour réduire la dimensionnalité du jeu de données d'entrée, de manière à obtenir la meilleure séparabilité entre les classes.\n",
"\n",
"Dans notre cas, une image d'entrée possède 784 pixels (caractéristiques d'entrée), et nous voulons utiliser l'ACP pour réduire le nombre de paramètres à seulement 2, afin de pouvoir les tracer sur un graphique. Ces deux paramètres seraient une combinaison linéaire des caractéristiques originales, et nous pouvons considérer cette procédure comme une \"rotation\" de notre espace original à 784 dimensions pour observer sa projection dans un espace 2D, jusqu'à obtenir la meilleure vue qui sépare les classes.\n"
"Dans notre cas, une image d'entrée comporte 784 pixels (caractéristiques d'entrée), et nous voulons utiliser l'ACP pour réduire le nombre de paramètres à seulement 2, afin de pouvoir les représenter sur un graphique. Ces deux paramètres seraient une combinaison linéaire des caractéristiques originales, et nous pouvons considérer cette procédure comme une \"rotation\" de notre espace original à 784 dimensions et l'observation de sa projection dans un espace 2D, jusqu'à obtenir la meilleure vue qui sépare les classes.\n"
]
},
{
@ -1025,16 +1027,16 @@
}
},
"source": [
"Comme vous pouvez le voir, 0 et 1 peuvent être clairement séparés par une ligne droite. Cela indique que, dans l'espace original à 784 dimensions, les points correspondant aux chiffres sont également linéairement séparables. Dans le cas de 2 et 5, nous ne pouvons pas trouver une bonne projection qui sépare clairement les chiffres, ce qui entraîne certains cas de mauvaise classification.\n",
"Comme vous pouvez le voir, 0 et 1 peuvent être clairement séparés par une ligne droite. Cela indique que dans l'espace original à 784 dimensions, les points correspondant aux chiffres sont également linéairement séparables. Dans le cas de 2 et 5, nous ne pouvons pas trouver une bonne projection qui sépare clairement les chiffres, ce qui entraîne donc certains cas de mauvaise classification.\n",
"\n",
"> Plus tard dans ce cours, nous apprendrons à créer des classificateurs non linéaires en utilisant les réseaux neuronaux, et à résoudre le problème des chiffres qui ne sont pas correctement alignés. Très bientôt, nous atteindrons une précision supérieure à 99 % dans la classification des chiffres MNIST, tout en les classant en 10 catégories différentes.\n",
"> Plus tard dans ce cours, nous apprendrons à créer des classificateurs non linéaires en utilisant les réseaux de neurones, et à résoudre le problème des chiffres qui ne sont pas correctement alignés. Très bientôt, nous atteindrons une précision supérieure à 99 % dans la classification des chiffres MNIST, tout en les classant en 10 catégories différentes.\n",
"\n",
"## Points clés\n",
"\n",
" * Nous avons appris l'architecture la plus simple d'un réseau neuronal : le perceptron à une couche.\n",
" * Nous avons implémenté le perceptron \"manuellement\", en utilisant une procédure d'entraînement simple basée sur la descente de gradient.\n",
" * Nous avons appris l'architecture la plus simple d'un réseau de neurones : le perceptron à une couche.\n",
" * Nous avons implémenté le perceptron \"à la main\", en utilisant une procédure d'entraînement simple basée sur la descente de gradient.\n",
" * Malgré sa simplicité, le perceptron à une couche peut résoudre des problèmes assez complexes de reconnaissance de chiffres manuscrits.\n",
" * Le perceptron à une couche est un classificateur linéaire, et il offre donc la même capacité de classification que la régression logistique.\n",
" * Le perceptron à une couche est un classificateur linéaire, et il offre donc le même pouvoir de classification que la régression logistique.\n",
" * Dans l'espace des échantillons, le perceptron peut séparer deux classes de données d'entrée en utilisant un hyperplan.\n"
]
},
@ -1044,14 +1046,14 @@
"source": [
"## Crédits\n",
"\n",
"Ce notebook fait partie du programme [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners) et a été préparé par [Dmitry Soshnikov](http://soshnikov.com). Il s'inspire de l'atelier sur les réseaux neuronaux de Microsoft Research Cambridge. Certains codes et matériaux illustratifs proviennent des présentations de [Katja Hoffmann](https://www.microsoft.com/en-us/research/people/kahofman/), [Matthew Johnson](https://www.microsoft.com/en-us/research/people/matjoh/) et [Ryoto Tomioka](https://www.microsoft.com/en-us/research/people/ryoto/), ainsi que du dépôt [NeuroWorkshop](http://github.com/shwars/NeuroWorkshop).\n"
"Ce notebook fait partie du programme [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners) et a été préparé par [Dmitry Soshnikov](http://soshnikov.com). Il s'inspire de l'atelier sur les réseaux neuronaux organisé par Microsoft Research Cambridge. Certains codes et matériaux illustratifs proviennent des présentations de [Katja Hoffmann](https://www.microsoft.com/en-us/research/people/kahofman/), [Matthew Johnson](https://www.microsoft.com/en-us/research/people/matjoh/) et [Ryoto Tomioka](https://www.microsoft.com/en-us/research/people/ryoto/), ainsi que du dépôt [NeuroWorkshop](http://github.com/shwars/NeuroWorkshop).\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Avertissement** : \nCe document a été traduit à l'aide du service de traduction automatique [Co-op Translator](https://github.com/Azure/co-op-translator). Bien que nous nous efforcions d'assurer l'exactitude, veuillez noter que les traductions automatisées peuvent contenir des erreurs ou des inexactitudes. Le document original dans sa langue d'origine doit être considéré comme la source faisant autorité. Pour des informations critiques, il est recommandé de recourir à une traduction professionnelle réalisée par un humain. Nous déclinons toute responsabilité en cas de malentendus ou d'interprétations erronées résultant de l'utilisation de cette traduction.\n"
"\n---\n\n**Avertissement** : \nCe document a été traduit à l'aide du service de traduction automatique [Co-op Translator](https://github.com/Azure/co-op-translator). Bien que nous nous efforcions d'assurer l'exactitude, veuillez noter que les traductions automatisées peuvent contenir des erreurs ou des inexactitudes. Le document original dans sa langue d'origine doit être considéré comme la source faisant autorité. Pour des informations critiques, il est recommandé de recourir à une traduction humaine professionnelle. Nous déclinons toute responsabilité en cas de malentendus ou d'interprétations erronées résultant de l'utilisation de cette traduction.\n"
]
}
],
@ -1080,8 +1082,8 @@
"start_slideshow_at": "selected"
},
"coopTranslator": {
"original_hash": "914fc55f59efc7e17b8130d4033ac617",
"translation_date": "2025-08-31T14:59:43+00:00",
"original_hash": "d67e5b54ba20b507aa88d71aa3d042d8",
"translation_date": "2025-10-03T13:04:09+00:00",
"source_file": "lessons/3-NeuralNetworks/03-Perceptron/Perceptron.ipynb",
"language_code": "fr"
}

View File

@ -9,11 +9,11 @@
}
},
"source": [
"## פרספטרון\n",
"## פרספטון\n",
"\n",
"> מחברת זו היא חלק מ-[AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners). בקרו במאגר לקבלת סט מלא של חומרי לימוד.\n",
"\n",
"כפי שדיברנו, פרספטרון מאפשר לפתור **בעיית סיווג בינארית**, כלומר לסווג דוגמאות קלט לשתי קטגוריות - נוכל לקרוא להן **חיובית** ו-**שלילית**.\n",
"כפי שדיברנו, פרספטון מאפשר לכם לפתור **בעיית סיווג בינארית**, כלומר לסווג דוגמאות קלט לשתי קטגוריות - נוכל לקרוא להן **חיובית** ו**שלילית**.\n",
"\n",
"ראשית, בואו נייבא כמה ספריות נדרשות.\n"
]
@ -49,7 +49,7 @@
"source": [
"## בעיית צעצוע\n",
"\n",
"נתחיל עם בעיית צעצוע, שבה יש לנו שני מאפייני קלט. לדוגמה, ברפואה נרצה לסווג גידולים לשפירים וממאירים, בהתאם לגודלם וגילם.\n",
"נתחיל עם בעיית צעצוע, שבה יש לנו שני מאפייני קלט. לדוגמה, ברפואה נרצה לסווג גידולים לשפירים וממאירים, בהתאם לגודלם ולגילם.\n",
"\n",
"ניצור מערך נתונים אקראי לסיווג באמצעות הפונקציה `make_classification` מספריית SciKit Learn:\n"
]
@ -154,11 +154,11 @@
"source": [
"## פרספטרון\n",
"\n",
"מכיוון שפרספטרון הוא מסווג בינארי, עבור כל וקטור קלט $x$ הפלט של הפרספטרון שלנו יהיה או +1 או -1, בהתאם למחלקה. הפלט יחושב באמצעות הנוסחה:\n",
"מכיוון שפרספטרון הוא מסווג בינארי, עבור כל וקטור קלט $x$ הפלט של הפרספטרון שלנו יהיה או +1 או -1, בהתאם למחלקה. הפלט יחושב באמצעות הנוסחה\n",
"\n",
"$$y(\\mathbf{x}) = f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x})$$\n",
"\n",
"כאשר $\\mathbf{w}$ הוא וקטור משקלים, ו-$f$ היא פונקציית הפעלה מדרגתית:\n",
"כאשר $\\mathbf{w}$ הוא וקטור משקל, ו-$f$ היא פונקציית הפעלה מדרגה:\n",
"$$\n",
"f(x) = \\begin{cases}\n",
" +1 & x \\geq 0 \\\\\n",
@ -166,7 +166,7 @@
" \\end{cases} \\\\\n",
"$$\n",
"\n",
"עם זאת, מודל לינארי כללי צריך לכלול גם הטיה (bias), כלומר באופן אידיאלי עלינו לחשב $y$ כ-$y=f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}+\\mathbf{b})$. כדי לפשט את המודל שלנו, ניתן להיפטר מרכיב ההטיה על ידי הוספת ממד נוסף לתכונות הקלט שלנו, שתמיד שווה ל-1:\n"
"עם זאת, מודל ליניארי כללי צריך לכלול גם הטיה (bias), כלומר באופן אידיאלי עלינו לחשב את $y$ כ-$y=f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}+\\mathbf{b})$. כדי לפשט את המודל שלנו, ניתן להיפטר ממונח ההטיה על ידי הוספת ממד נוסף לתכונות הקלט שלנו, שתמיד שווה ל-1:\n"
]
},
{
@ -272,7 +272,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"עכשיו בואו נריץ את האימון על מערך הנתונים שלנו:\n"
":עכשיו בואו נריץ את האימון על מערך הנתונים שלנו\n"
]
},
{
@ -311,9 +311,9 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"כפי שאתם יכולים לראות, הדיוק ההתחלתי הוא סביב 50%, אך הוא עולה במהירות לערכים גבוהים הקרובים ל-90%.\n",
"כפי שניתן לראות, הדיוק ההתחלתי הוא סביב 50%, אך הוא עולה במהירות לערכים גבוהים הקרובים ל-90%.\n",
"\n",
"בואו נמחיש כיצד הכיתות מופרדות. פונקציית הסיווג שלנו נראית כמו $\\mathbf{w}^Tx$, והיא גדולה מ-0 עבור כיתה אחת, ונמוכה מ-0 עבור כיתה אחרת. לכן, קו ההפרדה בין הכיתות מוגדר על ידי $\\mathbf{w}^Tx = 0$. מכיוון שיש לנו רק שני ממדים $x_0$ ו-$x_1$, המשוואה עבור הקו תהיה $w_0x_0+w_1x_1+w_2 = 0$ (זכרו שהגדרנו במפורש ממד נוסף $x_2=1$). בואו נשרטט את הקו הזה:\n"
"בואו נמחיש כיצד המחלקות מופרדות. פונקציית הסיווג שלנו נראית כמו $\\mathbf{w}^Tx$, והיא גדולה מ-0 עבור מחלקה אחת, ונמוכה מ-0 עבור מחלקה אחרת. לכן, קו ההפרדה בין המחלקות מוגדר על ידי $\\mathbf{w}^Tx = 0$. מכיוון שיש לנו רק שני ממדים $x_0$ ו-$x_1$, המשוואה עבור הקו תהיה $w_0x_0+w_1x_1+w_2 = 0$ (זכרו שהגדרנו במפורש ממד נוסף $x_2=1$). בואו נשרטט את הקו הזה:\n"
]
},
{
@ -379,9 +379,9 @@
}
},
"source": [
"## הערכה על קבוצת הנתונים לבחינה\n",
"## הערכה על קבוצת הבדיקה\n",
"\n",
"בהתחלה, שמרנו חלק מהנתונים עבור קבוצת הנתונים לבחינה. בואו נראה עד כמה המסווג שלנו מדויק על קבוצת נתונים זו. כדי לעשות זאת, אנו גם מרחיבים את קבוצת הנתונים לבחינה עם ממד נוסף, מכפילים במטריצת המשקלים, ומוודאים שהערך שהתקבל הוא באותו סימן כמו התווית (+1 או -1). לאחר מכן, אנו מחברים את כל הערכים הבוליאניים ומחלקים באורך הדגימה לבחינה, כדי לקבל את רמת הדיוק:\n"
"בהתחלה, שמרנו חלק מהנתונים עבור קבוצת הבדיקה. בואו נראה עד כמה המסווג שלנו מדויק על קבוצת הבדיקה הזו. כדי לעשות זאת, אנו גם מרחיבים את קבוצת הבדיקה עם ממד נוסף, מכפילים במטריצת המשקלים, ומוודאים שהערך שהתקבל הוא באותו סימן כמו התווית (+1 או -1). לאחר מכן אנו מחברים את כל הערכים הבוליאניים ומחלקים באורך הדגימה של קבוצת הבדיקה, כדי לקבל את רמת הדיוק:\n"
]
},
{
@ -422,7 +422,7 @@
"source": [
"## התבוננות בתהליך האימון\n",
"\n",
"ראינו קודם לכן כיצד הדיוק יורד במהלך האימון. יהיה מעניין לראות כיצד קו ההפרדה מתנהג במהלך האימון. הקוד למטה יציג את הכל על גרף אחד, ותוכלו להזיז את הסליידר כדי \"לנסוע בזמן\" לאורך תהליך האימון.\n"
"ראינו קודם איך הדיוק יורד במהלך האימון. יהיה מעניין לראות איך קו ההפרדה מתנהג במהלך האימון. הקוד למטה ימחיש הכל על גרף אחד, ותוכלו להזיז את הסליידר כדי \"לנסוע בזמן\" דרך תהליך האימון.\n"
]
},
{
@ -605,21 +605,21 @@
}
},
"source": [
"כפי שניתן לראות מהגרף למעלה, הדיוק לעולם לא עולה מעל 75%, מכיוון שבלתי אפשרי לצייר קו ישר כך שיכסה את כל הדוגמאות האפשריות בצורה נכונה.\n",
"כפי שניתן לראות מהגרף למעלה, הדיוק לעולם אינו עולה מעל 75%, מכיוון שלא ניתן לצייר קו ישר בצורה כזו שתתאים לכל הדוגמאות האפשריות.\n",
"\n",
"בעיית ה-XOR היא דוגמה קלאסית למגבלות של פרספטרון, והיא הוצגה על ידי מרווין מינסקי וסיימור פפרט בשנת 1969 בספרם [Perceptrons](https://en.wikipedia.org/wiki/Perceptrons_(book)). תצפית זו הגבילה את המחקר בתחום הרשתות העצביות למשך כמעט 10 שנים, למרות ש-כפי שנראה בחלק הבא של הקורס שלנו- פרספטרונים רב-שכבתיים מסוגלים לחלוטין לפתור בעיות מסוג זה.\n",
"בעיית XOR היא דוגמה קלאסית למגבלות של פרספטרון, והיא הוצגה על ידי מרווין מינסקי וסיימור פפרט בשנת 1969 בספרם [Perceptrons](https://en.wikipedia.org/wiki/Perceptrons_(book)). תצפית זו הגבילה את המחקר בתחום הרשתות העצביות כמעט למשך 10 שנים, למרות - וכפי שנראה בחלק הבא של הקורס שלנו - שפרספטרונים רב-שכבתיים מסוגלים לפתור בעיות כאלה בצורה מושלמת.\n",
"\n",
"## דוגמה מורכבת - MNIST\n",
"\n",
"למרות שפרספטרון אינו יכול לפתור את בעיית ה-XOR, הוא יכול לפתור בעיות מורכבות בהרבה, כמו זיהוי תווים בכתב יד.\n",
"למרות שפרספטרון אינו יכול לפתור את בעיית XOR, הוא יכול לפתור בעיות מורכבות יותר, כמו זיהוי תווים בכתב יד.\n",
"\n",
אגר נתונים שנעשה בו שימוש תכוף בלימוד למידת מכונה נקרא [MNIST](https://en.wikipedia.org/wiki/MNIST_database). הוא נוצר על ידי המכון הלאומי לתקנים וטכנולוגיה (Modified National Institute of Standards and Technology), ומכיל סט אימון של 60,000 ספרות בכתב יד, שנאספו מכ-250 סטודנטים ועובדים של המכון. בנוסף, ישנו סט בדיקה של 10,000 ספרות, שנאספו מאנשים שונים.\n",
ערך נתונים שנעשה בו שימוש לעיתים קרובות בלימוד למידת מכונה נקרא [MNIST](https://en.wikipedia.org/wiki/MNIST_database). הוא נוצר על ידי המכון הלאומי לתקנים וטכנולוגיה (Modified National Institute of Standards and Technology), ומכיל מערך אימון של 60,000 ספרות בכתב יד, שנאספו מכ-250 תלמידים ועובדים של המכון. בנוסף, ישנו מערך בדיקה של 10,000 ספרות, שנאספו מאנשים שונים.\n",
"\n",
"כל הספרות מיוצגות על ידי תמונות בגווני אפור בגודל 28x28 פיקסלים.\n",
"\n",
"> מאגר הנתונים MNIST זמין כתחרות אימון באתר [Kaggle](https://www.kaggle.com/c/digit-recognizer), אתר שמארח תחרויות ואתגרים בתחום למידת מכונה. לאחר שתלמדו כיצד לסווג את הספרות של MNIST, תוכלו להגיש את הפתרון שלכם ל-Kaggle ולראות כיצד הוא מדורג ביחס למשתתפים אחרים.\n",
"> מערך הנתונים MNIST זמין כתחרות אימון באתר [Kaggle](https://www.kaggle.com/c/digit-recognizer), אתר שמארח תחרויות ואתגרים בלמידת מכונה. לאחר שתלמדו כיצד לסווג את ספרות MNIST, תוכלו להגיש את הפתרון שלכם ל-Kaggle ולראות כיצד הוא מדורג בין המשתתפים האחרים.\n",
"\n",
"נתחיל בטעינת מאגר הנתונים MNIST:\n"
"נתחיל בטעינת מערך הנתונים MNIST:\n"
]
},
{
@ -695,7 +695,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"מכיוון שפרספטרון הוא מסווג בינארי, נגביל את הבעיה שלנו לזיהוי שני ספרות בלבד. הפונקציה למטה תמלא מערכים של דוגמאות חיוביות ושליליות עם שתי ספרות נתונות (ותציג גם דוגמאות של הספרות הללו לצורך הבהרה).\n"
"מכיוון שפרספטרון הוא מסווג בינארי, נגביל את הבעיה שלנו לזיהוי שני ספרות בלבד. הפונקציה שלהלן תמלא מערכים של דוגמאות חיוביות ושליליות עם שתי הספרות הנתונות (ותציג גם דוגמאות של הספרות הללו לצורך הבהרה).\n"
]
},
{
@ -735,7 +735,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"נתחיל בלנסות לסווג בין 0 ל-1:\n"
"נתחיל בניסיון לסווג בין 0 ל-1:\n"
]
},
{
@ -833,9 +833,9 @@
"source": [
"שימו לב כיצד הדיוק עולה כמעט ל-100% במהירות רבה.\n",
"\n",
"אנא הזיזו את המחוון למיקום כלשהו לקראת סוף האימון, והתבוננו במטריצת המשקלות המוצגת בצד שמאל. מטריצה זו תאפשר לכם להבין כיצד הפרספטרון עובד בפועל. תוכלו לראות ערכי משקל גבוהים במרכז השדה, אשר מתאימים לפיקסלים שמופיעים בדרך כלל עבור הספרה 1, וערכים שליליים נמוכים בצדדים, שם נמצאים חלקים של הספרה 0. לכן, אם הספרה שמוצגת לפרספטרון היא אכן 1, החלק המרכזי שלה יוכפל בערכים גבוהים, מה שייצור תוצאה חיובית. לעומת זאת, כאשר הפרספטרון מזהה את הספרה 0, הפיקסלים המתאימים יוכפלו במספרים שליליים.\n",
"אנא הזיזו את המחוון למיקום כלשהו לקראת סוף האימון, והתבוננו במטריצת המשקל המוצגת בצד שמאל. מטריצה זו תאפשר לכם להבין כיצד הפרספטרון עובד בפועל. תוכלו לראות ערכי משקל גבוהים במרכז השדה, אשר מתאימים לפיקסלים שמופיעים בדרך כלל עבור הספרה 1, וערכים שליליים נמוכים בצדדים, שם נמצאים חלקים של הספרה 0. לכן, אם הספרה שמוצגת לפרספטרון היא אכן 1, החלק המרכזי שלה יוכפל בערכים גבוהים, מה שייצור תוצאה חיובית. לעומת זאת, כאשר הפרספטרון מזהה את הספרה 0, הפיקסלים המתאימים יוכפלו במספרים שליליים.\n",
"\n",
"> ייתכן שתשימו לב שאם ניתן לפרספטרון ספרה 1 שמעט הוזזה אופקית, כך שהפיקסלים שלה תופסים את המקום שבו נמצאים החלקים האנכיים של הספרה 0, אנו עשויים לקבל תוצאה שגויה. מכיוון שטבעו של מאגר הנתונים MNIST הוא כזה שכל הספרות ממורכזות וממוקמות כראוי, הפרספטרון מסתמך על כך כדי להבחין בין הספרות.\n",
"> ייתכן שתשימו לב שאם ניתן לפרספטרון ספרה 1 שמעט הוזזה אופקית, כך שהפיקסלים שלה תופסים את המקום שבו נמצאים החלקים האנכיים של הספרה 0, אנו עשויים לקבל תוצאה שגויה. זאת מכיוון שהאופי של מערך הנתונים MNIST הוא כזה שכל הספרות ממורכזות וממוקמות כראוי, והפרספטרון מסתמך על כך כדי להבחין בין הספרות.\n",
"\n",
"עכשיו בואו ננסה ספרות שונות:\n"
]
@ -917,7 +917,7 @@
"\n",
"כדי להבין מדוע זה קורה, נוכל לנסות להשתמש ב-[ניתוח רכיבים עיקריים](https://en.wikipedia.org/wiki/Principal_component_analysis) (PCA). זו טכניקת למידת מכונה המשמשת להורדת הממדיות של מערך הנתונים הקלטי, באופן שמאפשר להשיג את ההפרדה הטובה ביותר בין הקטגוריות.\n",
"\n",
"במקרה שלנו, תמונת קלט מכילה 784 פיקסלים (תכונות קלט), ואנו רוצים להשתמש ב-PCA כדי לצמצם את מספר הפרמטרים לשניים בלבד, כך שנוכל לשרטט אותם על גרף. שני הפרמטרים הללו יהיו שילוב ליניארי של התכונות המקוריות, ואנו יכולים לראות את התהליך הזה כ\"סיבוב\" של המרחב המקורי בעל 784 הממדים והתבוננות בהקרנה שלו למרחב דו-ממדי, עד שנקבל את התצוגה הטובה ביותר שמפרידה בין הקטגוריות.\n"
"במקרה שלנו, תמונת קלט מכילה 784 פיקסלים (תכונות קלט), ואנו רוצים להשתמש ב-PCA כדי לצמצם את מספר הפרמטרים לשניים בלבד, כך שנוכל לשרטט אותם על גרף. שני הפרמטרים הללו יהיו שילוב ליניארי של התכונות המקוריות, ואפשר לראות את התהליך הזה כ\"סיבוב\" של המרחב המקורי בעל 784 הממדים והתבוננות בהקרנה שלו למרחב דו-ממדי, עד שנקבל את התצוגה הטובה ביותר שמפרידה בין הקטגוריות.\n"
]
},
{
@ -1027,17 +1027,17 @@
}
},
"source": [
"כפי שניתן לראות, ניתן להפריד בבירור בין 0 ל-1 באמצעות קו ישר. הדבר מעיד על כך שבמרחב המקורי בעל 784 הממדים, הנקודות שמייצגות את הספרות ניתנות גם הן להפרדה ליניארית. במקרה של 2 ו-5, לא ניתן למצוא הקרנה טובה שתפריד בבירור בין הספרות, ולכן ישנם מקרים של סיווג שגוי.\n",
"כפי שניתן לראות, ניתן להפריד בבירור בין 0 ל-1 באמצעות קו ישר. הדבר מצביע על כך שבמרחב המקורי בעל 784 הממדים, הנקודות המתאימות לספרות ניתנות להפרדה ליניארית. במקרה של 2 ו-5, לא ניתן למצוא את ההקרנה המתאימה שתפריד בבירור בין הספרות, ולכן ישנם מקרים של סיווג שגוי.\n",
"\n",
"> בהמשך הקורס נלמד כיצד ליצור מסווגים לא-ליניאריים באמצעות רשתות נוירונים, וכיצד להתמודד עם בעיות שבהן הספרות אינן מיושרות כראוי. בקרוב מאוד נגיע לדיוק של מעל 99% בסיווג ספרות MNIST, תוך סיווגן ל-10 קטגוריות שונות.\n",
"> בהמשך הקורס נלמד כיצד ליצור מסווגים לא ליניאריים באמצעות רשתות נוירונים, וכיצד להתמודד עם בעיית ספרות שאינן מיושרות כראוי. בקרוב מאוד נגיע לדיוק של מעל 99% בסיווג ספרות MNIST, תוך סיווגן ל-10 קטגוריות שונות.\n",
"\n",
"## תובנות\n",
"\n",
" * למדנו על הארכיטקטורה הפשוטה ביותר של רשת נוירונים - פרספטרון בעל שכבה אחת.\n",
" * יישמנו את הפרספטרון \"ביד\", תוך שימוש בתהליך אימון פשוט המבוסס על ירידת גרדיאנט.\n",
" * למרות הפשטות, פרספטרון בעל שכבה אחת יכול לפתור בעיות מורכבות יחסית של זיהוי ספרות בכתב יד.\n",
" * פרספטרון בעל שכבה אחת הוא מסווג ליניארי, ולכן הוא מספק כוח סיווג זהה לזה של רגרסיה לוגיסטית.\n",
" * במרחב הדגימה, פרספטרון יכול להפריד בין שתי קטגוריות של נתוני קלט באמצעות היפר-מישור.\n"
" * למדנו על הארכיטקטורה הפשוטה ביותר של רשת נוירונים - פרספטון בעל שכבה אחת.\n",
" * יישמנו את הפרספטון \"בידיים\", באמצעות הליך אימון פשוט המבוסס על ירידת גרדיאנט.\n",
" * למרות הפשטות, פרספטון בעל שכבה אחת יכול לפתור בעיות מורכבות יחסית של זיהוי ספרות כתובות ביד.\n",
" * פרספטון בעל שכבה אחת הוא מסווג ליניארי, ולכן הוא מספק את אותה יכולת סיווג כמו רגרסיה לוגיסטית.\n",
" * במרחב הדוגמאות, פרספטון יכול להפריד בין שתי קטגוריות של נתוני קלט באמצעות היפר-מישור.\n"
]
},
{
@ -1046,7 +1046,7 @@
"source": [
"## קרדיטים\n",
"\n",
"מחברת זו היא חלק מ-[AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners), והוכנה על ידי [Dmitry Soshnikov](http://soshnikov.com). היא נוצרה בהשראת סדנת רשתות עצביות במרכז המחקר של מיקרוסופט בקיימברידג'. חלק מהקוד והחומרים האיורים נלקחו מתוך מצגות של [Katja Hoffmann](https://www.microsoft.com/en-us/research/people/kahofman/), [Matthew Johnson](https://www.microsoft.com/en-us/research/people/matjoh/) ו-[Ryoto Tomioka](https://www.microsoft.com/en-us/research/people/ryoto/), וכן מתוך מאגר [NeuroWorkshop](http://github.com/shwars/NeuroWorkshop).\n"
"מחברת זו היא חלק מ-[AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners), והוכנה על ידי [דמיטרי סושניקוב](http://soshnikov.com). היא נוצרה בהשראת סדנת רשתות עצביות במרכז המחקר של מיקרוסופט בקיימברידג'. חלק מהקוד והחומרים האיוריים נלקחו מתוך מצגות של [קטיה הופמן](https://www.microsoft.com/en-us/research/people/kahofman/), [מת'יו ג'ונסון](https://www.microsoft.com/en-us/research/people/matjoh/) ו-[ריוטו טומיוקה](https://www.microsoft.com/en-us/research/people/ryoto/), וכן מתוך מאגר [NeuroWorkshop](http://github.com/shwars/NeuroWorkshop).\n"
]
},
{
@ -1082,8 +1082,8 @@
"start_slideshow_at": "selected"
},
"coopTranslator": {
"original_hash": "914fc55f59efc7e17b8130d4033ac617",
"translation_date": "2025-08-28T22:24:31+00:00",
"original_hash": "d67e5b54ba20b507aa88d71aa3d042d8",
"translation_date": "2025-10-03T13:34:11+00:00",
"source_file": "lessons/3-NeuralNetworks/03-Perceptron/Perceptron.ipynb",
"language_code": "he"
}

View File

@ -13,7 +13,7 @@
"\n",
"> यह नोटबुक [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners) का हिस्सा है। पूरी सीखने की सामग्री के लिए रिपॉजिटरी पर जाएं।\n",
"\n",
"जैसा कि हमने चर्चा की है, परसेप्ट्रॉन आपको **बाइनरी वर्गीकरण समस्या** हल करने की अनुमति देता है, यानी इनपुट उदाहरणों को दो वर्गों में वर्गीकृत करना - जिन्हें हम **सकारात्मक** और **नकारात्मक** कह सकते हैं।\n",
"जैसा कि हमने चर्चा की है, परसेप्ट्रॉन आपको **बाइनरी वर्गीकरण समस्या** हल करने की अनुमति देता है, यानी इनपुट उदाहरणों को दो वर्गों में वर्गीकृत करना - हम उन्हें **सकारात्मक** और **नकारात्मक** कह सकते हैं।\n",
"\n",
"सबसे पहले, कुछ आवश्यक लाइब्रेरी आयात करते हैं।\n"
]
@ -49,7 +49,7 @@
"source": [
"## खिलौना समस्या\n",
"\n",
"शुरुआत करने के लिए, चलिए एक साधारण समस्या से शुरू करते हैं, जहां हमारे पास दो इनपुट फीचर्स हैं। उदाहरण के लिए, चिकित्सा में हम ट्यूमर को उसके आकार और उम्र के आधार पर सौम्य (benign) और घातक (malignant) में वर्गीकृत करना चाह सकते हैं।\n",
"शुरुआत करने के लिए, चलिए एक खिलौना समस्या से शुरू करते हैं, जहां हमारे पास दो इनपुट विशेषताएँ हैं। उदाहरण के लिए, चिकित्सा में हम ट्यूमर को सौम्य और घातक में वर्गीकृत करना चाह सकते हैं, इसके आकार और उम्र के आधार पर।\n",
"\n",
"हम SciKit Learn लाइब्रेरी के `make_classification` फ़ंक्शन का उपयोग करके एक रैंडम वर्गीकरण डेटासेट बनाएंगे:\n"
]
@ -154,11 +154,11 @@
"source": [
"## परसेप्ट्रॉन\n",
"\n",
"चूंकि परसेप्ट्रॉन एक बाइनरी क्लासिफायर है, प्रत्येक इनपुट वेक्टर $x$ के लिए हमारे परसेप्ट्रॉन का आउटपुट +1 या -1 होगा, जो वर्ग पर निर्भर करता है। आउटपुट निम्नलिखित सूत्र का उपयोग करके गणना किया जाएगा:\n",
"चूंकि परसेप्ट्रॉन एक द्विआधारी वर्गीकरणकर्ता है, प्रत्येक इनपुट वेक्टर $x$ के लिए हमारे परसेप्ट्रॉन का आउटपुट या तो +1 होगा या -1, यह वर्ग पर निर्भर करता है। आउटपुट निम्नलिखित सूत्र का उपयोग करके गणना किया जाएगा:\n",
"\n",
"$$y(\\mathbf{x}) = f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x})$$\n",
"\n",
"जहां $\\mathbf{w}$ एक वेट वेक्टर है, $f$ एक स्टेप एक्टिवेशन फंक्शन है:\n",
"जहां $\\mathbf{w}$ एक वेट वेक्टर है, और $f$ एक स्टेप एक्टिवेशन फंक्शन है:\n",
"$$\n",
"f(x) = \\begin{cases}\n",
" +1 & x \\geq 0 \\\\\n",
@ -166,7 +166,7 @@
" \\end{cases} \\\\\n",
"$$\n",
"\n",
"हालांकि, एक सामान्य लीनियर मॉडल में बायस भी होना चाहिए, यानी आदर्श रूप से हमें $y$ को $y=f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}+\\mathbf{b})$ के रूप में गणना करनी चाहिए। हमारे मॉडल को सरल बनाने के लिए, हम अपने इनपुट फीचर्स में एक और आयाम जोड़कर इस बायस टर्म को हटा सकते हैं, जो हमेशा 1 के बराबर होता है:\n"
"हालांकि, एक सामान्य रैखिक मॉडल में एक बायस भी होना चाहिए, यानी आदर्श रूप से हमें $y$ को $y=f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}+\\mathbf{b})$ के रूप में गणना करनी चाहिए। हमारे मॉडल को सरल बनाने के लिए, हम इस बायस टर्म को हटा सकते हैं और अपनी इनपुट विशेषताओं में एक और आयाम जोड़ सकते हैं, जो हमेशा 1 के बराबर होता है:\n"
]
},
{
@ -204,22 +204,22 @@
}
},
"source": [
"## प्रशिक्षण एल्गोरिम\n",
"## प्रशिक्षण एल्गोरिथ्म\n",
"\n",
"परसेप्ट्रॉन को प्रशिक्षित करने के लिए, हमें ऐसे वज़न $\\mathbf{w}$ खोजने होंगे जो त्रुटि को न्यूनतम करें। त्रुटि को **परसेप्ट्रॉन मानदंड** का उपयोग करके परिभाषित किया गया है:\n",
"\n",
"$$E(\\mathbf{w}) = -\\sum_{n \\in \\mathcal{M}}\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}_{n}t_{n}$$\n",
" \n",
" * $t_{n} \\in \\{-1, +1\\}$ नकारात्मक और सकारात्मक प्रशिक्षण नमूनों के लिए, क्रमशः\n",
" * $t_{n} \\in \\{-1, +1\\}$ नकारात्मक और सकारात्मक प्रशिक्षण नमूनों के लिए क्रमशः\n",
" * $\\mathcal{M}$ - गलत वर्गीकृत उदाहरणों का सेट\n",
" \n",
"हम **ग्रेडिएंट डिसेंट** प्रक्रिया का उपयोग करेंगे। कुछ प्रारंभिक यादृच्छिक वज़न $\\mathbf{w}^{(0)}$ से शुरू करते हुए, हम प्रशिक्षण के प्रत्येक चरण में त्रुटि $E$ के ग्रेडिएंट का उपयोग करके वज़न को समायोजित करेंगे:\n",
"हम **ग्रेडिएंट डिसेंट** प्रक्रिया का उपयोग करेंगे। कुछ प्रारंभिक यादृच्छिक वज़न $\\mathbf{w}^{(0)}$ से शुरू करते हुए, हम प्रशिक्षण के प्रत्येक चरण में $E$ के ग्रेडिएंट का उपयोग करके वज़न को समायोजित करेंगे:\n",
"\n",
"$$\\mathbf{w}^{\\tau + 1}=\\mathbf{w}^{\\tau} - \\eta \\nabla E(\\mathbf{w}) = \\mathbf{w}^{\\tau} + \\eta\\sum_{n \\in \\mathcal{M}}\\mathbf{x}_{n} t_{n}$$\n",
"\n",
"जहां $\\eta$ एक **लर्निंग रेट** है, और $\\tau\\in\\mathbb{N}$ - पुनरावृत्ति की संख्या।\n",
"\n",
"आइए इस एल्गोरिम को Python में परिभाषित करें:\n"
"आइए इस एल्गोरिथ्म को Python में परिभाषित करें:\n"
]
},
{
@ -271,7 +271,9 @@
{
"cell_type": "markdown",
"metadata": {},
"source": []
"source": [
"अब चलिए हमारे डेटासेट पर प्रशिक्षण शुरू करते हैं:\n"
]
},
{
"cell_type": "code",
@ -309,9 +311,9 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"जैसा कि आप देख सकते हैं, प्रारंभिक सटीकता लगभग 50% है, लेकिन यह जल्दी ही बढ़कर 90% के करीब उच्च मानों तक पहुँच जाती है।\n",
"जैसा कि आप देख सकते हैं, प्रारंभिक सटीकता लगभग 50% है, लेकिन यह जल्दी ही बढ़कर लगभग 90% के करीब हो जाती है।\n",
"\n",
"आइए देखें कि वर्ग कैसे अलग किए जाते हैं। हमारा वर्गीकरण फ़ंक्शन $\\mathbf{w}^Tx$ जैसा दिखता है, और यह एक वर्ग के लिए 0 से अधिक होता है, और दूसरे वर्ग के लिए 0 से कम। इस प्रकार, वर्ग अलगाव रेखा $\\mathbf{w}^Tx = 0$ द्वारा परिभाषित होती है। चूंकि हमारे पास केवल दो आयाम $x_0$ और $x_1$ हैं, रेखा के लिए समीकरण $w_0x_0+w_1x_1+w_2 = 0$ होगा (याद रखें कि हमने स्पष्ट रूप से एक अतिरिक्त आयाम $x_2=1$ परिभाषित किया है)। आइए इस रेखा को प्लॉट करें:\n"
"आइए देखें कि वर्गों को कैसे अलग किया गया है। हमारा वर्गीकरण फ़ंक्शन $\\mathbf{w}^Tx$ जैसा दिखता है, और यह एक वर्ग के लिए 0 से अधिक है, और दूसरे वर्ग के लिए 0 से कम। इसलिए, वर्ग अलगाव रेखा $\\mathbf{w}^Tx = 0$ द्वारा परिभाषित होती है। चूंकि हमारे पास केवल दो आयाम $x_0$ और $x_1$ हैं, रेखा के लिए समीकरण $w_0x_0+w_1x_1+w_2 = 0$ होगा (याद रखें कि हमने स्पष्ट रूप से एक अतिरिक्त आयाम $x_2=1$ परिभाषित किया है)। आइए इस रेखा को प्लॉट करें:\n"
]
},
{
@ -377,9 +379,9 @@
}
},
"source": [
"## परीक्षण डेटासेट पर मूल्यांकन करें\n",
"## टेस्ट डेटासेट पर मूल्यांकन करें\n",
"\n",
"शुरुआत में, हमने कुछ डेटा को परीक्षण डेटासेट के लिए अलग रखा है। आइए देखें कि हमारा वर्गीकरणकर्ता इस परीक्षण डेटासेट पर कितना सटीक है। ऐसा करने के लिए, हम परीक्षण डेटासेट में एक अतिरिक्त आयाम जोड़ते हैं, वज़न मैट्रिक्स से गुणा करते हैं, और सुनिश्चित करते हैं कि प्राप्त मान लेबल (+1 या -1) के समान चिह्न का हो। इसके बाद, हम सभी बूलियन मानों को जोड़ते हैं और परीक्षण नमूने की लंबाई से विभाजित करते हैं, ताकि सटीकता प्राप्त की जा सके:\n"
"शुरुआत में, हमने कुछ डेटा को टेस्ट डेटासेट के लिए अलग रखा था। आइए देखें कि हमारा क्लासिफायर इस टेस्ट डेटासेट पर कितना सटीक है। ऐसा करने के लिए, हम टेस्ट डेटासेट को एक अतिरिक्त आयाम के साथ विस्तारित करते हैं, वेट्स मैट्रिक्स से गुणा करते हैं, और सुनिश्चित करते हैं कि प्राप्त मान लेबल (+1 या -1) के समान चिह्न का हो। इसके बाद, हम सभी बूलियन मानों को जोड़ते हैं और टेस्ट सैंपल की लंबाई से विभाजित करते हैं, ताकि सटीकता प्राप्त हो सके:\n"
]
},
{
@ -420,7 +422,7 @@
"source": [
"## प्रशिक्षण प्रक्रिया का अवलोकन\n",
"\n",
"हमने पहले देखा है कि प्रशिक्षण के दौरान सटीकता कैसे घटती है। यह देखना दिलचस्प होगा कि प्रशिक्षण के दौरान विभाजन रेखा कैसे व्यवहार करती है। नीचे दिया गया कोड सब कुछ एक ग्राफ पर प्रदर्शित करेगा, और आपको स्लाइडर को खिसकाकर प्रशिक्षण प्रक्रिया मे \"समय यात्रा\" करने का मौका मिलेगा।\n"
"हमने पहले देखा है कि प्रशिक्षण के दौरान सटीकता कैसे घटती है। यह देखना अच्छा होगा कि प्रशिक्षण के दौरान विभाजन रेखा कैसे व्यवहार करती है। नीचे दिया गया कोड सब कुछ एक ग्राफ पर प्रदर्शित करेगा, और आपको स्लाइडर को स्थानांतरित करके प्रशिक्षण प्रक्रिया के ाध्यम से \"समय यात्रा\" करने में सक्षम होना चाहिए।\n"
]
},
{
@ -527,16 +529,16 @@
"source": [
"## परसेप्ट्रॉन की सीमाएँ\n",
"\n",
"जैसा कि आपने ऊपर देखा, परसेप्ट्रॉन एक **रेखीय वर्गीकरणकर्ता** (linear classifier) है। यह दो वर्गों के बीच भेदभाव अच्छी तरह कर सकता है यदि वे **रेखीय रूप से पृथक** (linearly separable) हों, यानी उन्हें एक सीधी रेखा द्वारा अलग किया जा सक। अन्यथा, परसेप्ट्रॉन का प्रशिक्षण प्रक्रिया अभिसरण (converge) नहीं करेगी।\n",
"जैसा कि आपने ऊपर देखा, परसेप्ट्रॉन एक **रेखीय वर्गीकरणकर्ता** है। यह दो वर्गों के बीच अच्छी तरह से अंतर कर सकता है यदि वे **रेखीय रूप से पृथक** हैं, यानी उन्हें एक सीधी रेखा द्वारा अलग किया जा सकता है। अन्यथा, परसेप्ट्रॉन प्रशिक्षण प्रक्रिया अभिसरण नहीं करेगी।\n",
"\n",
"एक सबसे स्पष्ट उदाहरण उस समस्या का है जिसे परसेप्ट्रॉन हल नहीं कर सकता, जिसे **XOR समस्या** कहा जाता है। हम चाहते हैं कि हमारा परसेप्ट्रॉन XOR बूलियन फ़ंक्शन सीखे, जिसका निम्नलिखित सत्य सारणी (truth table) है:\n",
"एक सबसे स्पष्ट उदाहरण, जिसे परसेप्ट्रॉन हल नहीं कर सकता, वह है **XOR समस्या**। हम चाहते हैं कि हमारा परसेप्ट्रॉन XOR बूलियन फ़ंक्शन सीखे, जिसका निम्नलिखित सत्य सारणी है:\n",
"\n",
"| | 0 | 1 |\n",
"|---|---|---|\n",
"| 0 | 0 | 1 | \n",
"| 1 | 1 | 0 |\n",
"\n",
"आइए इसे करने की कोशिश करें! हम सभी सकारात्मक और नकारात्मक प्रशिक्षण नमूनों को मैन्युअल रूप से भरेंगे, और फिर ऊपर परिभाषित हमारी train फ़ंक्शन को कॉल करेंगे:\n"
"आइए इसे आजमाते हैं! हम सभी सकारात्मक और नकारात्मक प्रशिक्षण नमूनों को मैन्युअल रूप से भरेंगे, और फिर ऊपर परिभाषित हमारी train फ़ंक्शन को कॉल करेंगे:\n"
]
},
{
@ -603,19 +605,19 @@
}
},
"source": [
"जैसा कि ऊपर दिए गए ग्राफ से स्पष्ट है, सटीकता कभी भी 75% से ऊपर नहीं जाती, क्योंकि सभी संभावित उदाहरणों को सही तरीके से कवर करने के लिए एक सीधी रेखा खींचना असंभव है।\n",
"जैसा कि आप ऊपर दिए गए ग्राफ से देख सकते हैं, सटीकता कभी 75% से ऊपर नहीं जाती, क्योंकि सभी संभावित उदाहरणों को सही तरीके से प्राप्त करने के लिए एक सीधी रेखा खींचना असंभव है।\n",
"\n",
"XOR समस्या परसेप्ट्रॉन की सीमाओं का एक क्लासिकल उदाहरण है, और इसे 1969 में मार्विन मिंस्की और सीमोर पेपर्ट ने अपनी किताब [Perceptrons](https://en.wikipedia.org/wiki/Perceptrons_(book)) में उजागर किया था। इस अवलोकन ने लगभग 10 वर्षों तक न्यूरल नेटवर्क्स के क्षेत्र में शोध को सीमित कर दिया, हालांकि - और हम इसे अपने कोर्स के अगले भाग में देखेंगे - मल्टी-लेयर्ड परसेप्ट्रॉन इस प्रकार की समस्याओं को हल करने में पूरी तरह सक्षम हैं।\n",
"XOR समस्या परसेप्ट्रॉन की सीमाओं का एक क्लासिकल उदाहरण है, और इसे 1969 में मार्विन मिंस्की और सीमोर पेपर्ट ने अपनी किताब [Perceptrons](https://en.wikipedia.org/wiki/Perceptrons_(book)) में बताया था। इस अवलोकन ने लगभग 10 वर्षों तक न्यूरल नेटवर्क के क्षेत्र में शोध को सीमित कर दिया, हालांकि - और हम इसे अपने पाठ्यक्रम के अगले भाग में देखेंगे - मल्टी-लेयर्ड परसेप्ट्रॉन ऐसी समस्याओं को हल करने में पूरी तरह सक्षम हैं।\n",
"\n",
"## जटिल उदाहरण - MNIST\n",
"\n",
"हालांकि परसेप्ट्रॉन XOR समस्या को हल नहीं कर सकता, यह कई और जटिल समस्याओं को हल कर सकता है, जैसे हस्तलिखित अक्षरों की पहचान।\n",
"हालांकि परसेप्ट्रॉन XOR समस्या को हल नहीं कर सकता, यह कई अधिक जटिल समस्याओं को हल कर सकता है, जैसे हस्तलिखित अक्षरों की पहचान।\n",
"\n",
"मशीन लर्निंग में महारत हासिल करने के दौरान अक्सर उपयोग किया जाने वाला एक डेटासेट [MNIST](https://en.wikipedia.org/wiki/MNIST_database) कहलाता है। इसे मॉडिफाइड नेशनल इंस्टीट्यूट ऑफ स्टैंडर्ड्स एंड टेक्नोलॉजी द्वारा बनाया गया है और इसमें 60000 हस्तलिखित अंकों का एक प्रशिक्षण सेट शामिल है, जो लगभग 250 छात्रों और संस्थान के कर्मचारियों से एकत्रित किए गए हैं। इसके अलावा, 10000 अंकों का एक परीक्षण डेटासेट भी है, जो अलग-अलग व्यक्तियों से एकत्रित किया गया है।\n",
"मशीन लर्निंग में महारत हासिल करने के दौरान अक्सर उपयोग किया जाने वाला एक डेटासेट [MNIST](https://en.wikipedia.org/wiki/MNIST_database) कहलाता है। इसे Modified National Institute of Standards and Technology द्वारा बनाया गया है, और इसमें 60000 हस्तलिखित अंकों का एक प्रशिक्षण सेट शामिल है, जो लगभग 250 छात्रों और संस्थान के कर्मचारियों से एकत्रित किया गया है। इसके अलावा, 10000 अंकों का एक परीक्षण डेटासेट भी है, जो अलग-अलग व्यक्तियों से एकत्रित किया गया है।\n",
"\n",
"सभी अंक 28x28 पिक्सल के ग्रेस्केल इमेज के रूप में प्रस्तुत किए गए हैं।\n",
"\n",
"> MNIST डेटासेट [Kaggle](https://www.kaggle.com/c/digit-recognizer) पर एक प्रशिक्षण प्रतियोगिता के रूप में उपलब्ध है, जो मशीन लर्निंग प्रतियोगिताओं और कॉन्टेस्ट्स की मेजबानी करता है। एक बार जब आप MNIST अंकों को वर्गीकृत करना सीख जाते हैं, तो आप अपना समाधान Kaggle पर सबमिट कर सकते हैं और देख सकते हैं कि यह अन्य प्रतिभागियों के बीच कैसे रेट किया जाता है।\n",
"> MNIST डेटासेट [Kaggle](https://www.kaggle.com/c/digit-recognizer) पर एक प्रशिक्षण प्रतियोगिता के रूप में उपलब्ध है, जो मशीन लर्निंग प्रतियोगिताओं और कॉन्टेस्ट की मेजबानी करता है। एक बार जब आप MNIST अंकों को वर्गीकृत करना सीख जाते हैं, तो आप अपना समाधान Kaggle पर सबमिट कर सकते हैं और देख सकते हैं कि यह अन्य प्रतिभागियों के बीच कैसे रेट किया जाता है।\n",
"\n",
"हम MNIST डेटासेट को लोड करके शुरू करते हैं:\n"
]
@ -693,7 +695,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"क्योंकि परसेप्ट्रॉन एक द्विआधारी वर्गीकरणकर्ता है, हम अपनी समस्या को केवल दो अंकों को पहचानने तक सीमित करेंगे। नीचे दिया गया फ़ंक्शन दो दिए गए अंकों के साथ सकारात्मक और नकारात्मक नमूना सरणियों को भर देगा (और स्पष्टता के लिए उन अंकों के नमूने भी दिखाएगा)।\n"
"क्योंकि परसेप्ट्रॉन एक द्विआधारी वर्गीकरणकर्ता है, हम अपनी समस्या को केवल दो अंकों को पहचानने तक सीमित करेंगे। नीचे दिया गया फ़ंक्शन दो दिए गए अंकों के साथ सकारात्मक और नकारात्मक नमूना ऐरे को भर देगा (और स्पष्टता के लिए उन अंकों के नमूने भी दिखाएगा)।\n"
]
},
{
@ -732,7 +734,9 @@
{
"cell_type": "markdown",
"metadata": {},
"source": []
"source": [
"हम 0 और 1 के बीच वर्गीकरण करने का प्रयास करके शुरू करेंगे:\n"
]
},
{
"cell_type": "code",
@ -827,11 +831,11 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"कृपया ध्यान दें कि सटीकता बहुत तेजी से लगभग 100% तक पहुँच जाती है।\n",
"कृपया ध्यान दें कि सटीकता बहुत तेजी से लगभग 100% तक पहुँच जाती है।\n",
"\n",
"कृपया, प्रशिक्षण के अंत की ओर स्लाइडर को किसी स्थिति पर ले जाएँ, और बाईं ओर प्लॉट किए गए वेट मैट्रिक्स को देखें। यह मैट्रिक्स आपको समझने में मदद करेगा कि परसेप्ट्रॉन वास्तव में कैसे काम करता है। आप फ़ील्ड के बीच में उच्च वेट मान देख सकते हैं, जो उन पिक्सल्स से मेल खाते हैं जो आमतौर पर अंक 1 के लिए मौजूद होते हैं, और किनारों पर निम्न नकारात्मक मान, जहाँ अंक 0 के हिस्से होते हैं। तो, यदि परसेप्ट्रॉन को प्रस्तुत किया गया अंक वास्तव में 1 है, तो इसका मध्य भाग उच्च मानों से गुणा होगा, जिससे सकारात्मक परिणाम उत्पन्न होगा। इसके विपरीत, जब परसेप्ट्रॉन 0 को देखता है, तो संबंधित पिक्सल्स नकारात्मक संख्याओं से गुणा होंगे।\n",
"कृपया, प्रशिक्षण के अंत की ओर स्लाइडर को किसी स्थिति पर ले जाएँ और बाईं ओर प्लॉट किए गए वज़न मैट्रिक्स को देखें। यह मैट्रिक्स आपको समझने में मदद करेगा कि परसेप्ट्रॉन वास्तव में कैसे काम करता है। आप देख सकते हैं कि क्षेत्र के मध्य में उच्च वज़न मान हैं, जो उन पिक्सल्स से मेल खाते हैं जो आमतौर पर अंक 1 के लिए मौजूद होते हैं, और किनारों पर निम्न नकारात्मक मान हैं, जहाँ अंक 0 के भाग होते हैं। तो, यदि परसेप्ट्रॉन को प्रस्तुत किया गया अंक वास्तव में 1 है, तो इसका मध्य भाग उच्च मानों से गुणा किया जाएगा, जिससे सकारात्मक परिणाम उत्पन्न होगा। इसके विपरीत, जब परसेप्ट्रॉन 0 को देखता है, तो संबंधित पिक्सल्स नकारात्मक संख्याओं से गुणा किए जाएँगे।\n",
"\n",
"> आप देख सकते हैं कि यदि हम अपने परसेप्ट्रॉन को थोड़ा क्षैतिज रूप से खिसका हुआ अंक 1 देते हैं, ताकि इसके पिक्सल्स उस स्थान पर आ जाएँ जहाँ 0 के ऊर्ध्वाधर हिस्से होते हैं, तो हमें गलत परिणाम मिल सकता है। चूँकि हमारे MNIST डेटासेट की प्रकृति ऐसी है कि सभी अंक केंद्रित और सही ढंग से स्थित होते हैं, और परसेप्ट्रॉन इसी पर निर्भर करता है कि वह अंकों के बीच अंतर कर सके।\n",
"> आप देख सकते हैं कि यदि हम अपने परसेप्ट्रॉन को अंक 1 देते हैं जो क्षैतिज रूप से थोड़ा खिसका हुआ है, ताकि इसके पिक्सल्स उस स्थान पर आ जाएँ जहाँ 0 के ऊर्ध्वाधर भाग होते हैं, तो हमें गलत परिणाम मिल सकता है। चूँकि हमारे MNIST डेटासेट की प्रकृति ऐसी है कि सभी अंक केंद्रित और सही तरीके से स्थित हैं, और परसेप्ट्रॉन इसी पर निर्भर करता है ताकि अंकों के बीच अंतर कर सके।\n",
"\n",
"अब चलिए अलग-अलग अंकों को आज़माते हैं:\n"
]
@ -909,11 +913,11 @@
"source": [
"## चर्चा\n",
"\n",
"किसी कारणवश, 2 और 5 को आसानी से अलग करना संभव नहीं है। भले ही हमें अपेक्षाकृत उच्च सटीकता (85% से अधिक) मिलती है, हम स्पष्ट रूप से देख सकते हैं कि किसी बिंदु पर परसेप्ट्रॉन सीखना बंद कर देता है।\n",
"किसी कारणवश, 2 और 5 को आसानी से अलग करना संभव नहीं है। हालांकि हमें अपेक्षाकृत उच्च सटीकता (85% से अधिक) प्राप्त होती है, लेकिन हम स्पष्ट रूप से देख सकते हैं कि किसी बिंदु पर perceptron सीखना बंद कर देता है।\n",
"\n",
"यह समझने के लिए कि ऐसा क्यों होता है, हम [प्रिंसिपल कंपोनेंट एनालिसिस](https://en.wikipedia.org/wiki/Principal_component_analysis) (PCA) का उपयोग करने की कोशिश कर सकते हैं। यह एक मशीन लर्निंग तकनीक है जिसका उपयोग इनपुट डेटा सेट के आयामों को कम करने के लिए किया जाता है, ताकि वर्गों के बीच सर्वोत्तम विभाजन प्राप्त किया जा सके।\n",
"यह समझने के लिए कि ऐसा क्यों होता है, हम [Principal Component Analysis](https://en.wikipedia.org/wiki/Principal_component_analysis) (PCA) का उपयोग कर सकते हैं। यह एक मशीन लर्निंग तकनीक है जिसका उपयोग इनपुट डेटा सेट की आयाम संख्या को कम करने के लिए किया जाता है, ताकि वर्गों के बीच सर्वोत्तम विभाजन प्राप्त किया जा सके।\n",
"\n",
"हमारे मामले में, एक इनपुट इमेज में 784 पिक्सल (इनपुट फीचर्स) होते हैं, और हम PCA का उपयोग करके पैरामीटर की संख्या को केवल 2 तक कम करना चाहते हैं, ताकि हम उन्हें ग्राफ पर प्लॉट कर सकें। ये दो पैरामीटर मूल फीचर्स का एक रैखिक संयोजन होंगे, और हम इस प्रक्रिया को इस रूप में देख सकते हैं कि हमारे मूल 784-आयामी स्थान को \"घुमाकर\" उसकी प्रक्षेपण को 2D-स्थान में देखा जाए, जब तक कि हमें वर्गों को अलग करने के लिए सबसे अच्छा दृश्य न मिल जाए।\n"
"हमारे मामले में, एक इनपुट इमेज में 784 पिक्सल (इनपुट फीचर्स) होते हैं, और हम PCA का उपयोग करके पैरामीटर की संख्या को केवल 2 तक कम करना चाहते हैं, ताकि हम उन्हें ग्राफ पर प्लॉट कर सकें। ये दो पैरामीटर मूल फीचर्स का एक रैखिक संयोजन होंगे, और हम इस प्रक्रिया को इस प्रकार देख सकते हैं कि हमारे मूल 784-आयामी स्थान को \"घुमाकर\" उसकी प्रोजेक्शन को 2D-स्थान पर देखा जाए, जब तक कि हमें वर्गों को अलग करने के लिए सबसे अच्छा दृश्य न मिल जाए।\n"
]
},
{
@ -1023,16 +1027,16 @@
}
},
"source": [
"जैसा कि आप देख सकते हैं, 0 और 1 को एक सीधी रेखा द्वारा स्पष्ट रूप से अलग किया जा सकता है। यह दर्शाता है कि मूल 784-डायमेंशनल स्पेस में अंकों से संबंधित बिंदु भी रेखीय रूप से अलग किए जा सकते हैं। लेकिन 2 और 5 के मामले में, हम ऐसा अच्छा प्रोजेक्शन नहीं ढूंढ सकते जो अंकों को स्पष्ट रूप से अलग कर सके, और इसलिए कुछ गलत वर्गीकरण के मामले सामने आते हैं।\n",
"जैसा कि आप देख सकते हैं, 0 और 1 को एक सीधी रेखा द्वारा स्पष्ट रूप से अलग किया जा सकता है। इसका मतलब है कि मूल 784-डायमेंशनल स्पेस में, अंकों से संबंधित बिंदु भी रेखीय रूप से अलग किए जा सकते हैं। लेकिन 2 और 5 के मामले में, हमें ऐसा अच्छा प्रोजेक्शन नहीं मिल पाता जो अंकों को स्पष्ट रूप से अलग कर सके, और इस कारण कुछ गलत वर्गीकरण के मामले सामने आते हैं।\n",
"\n",
"> इस कोर्स में आगे हम सीखेंगे कि नॉन-लिनियर क्लासिफायर कैसे बनाए जाते हैं, न्यूरल नेटवर्क्स का उपयोग करके, और उन समस्याओं से कैसे निपटा जाता है जहां अंक सही तरीके से संरेखित नहीं होते। बहुत जल्द हम MNIST अंकों की पहचान में 99% से अधिक सटीकता प्राप्त करेंगे, जबकि उन्हें 10 अलग-अलग वर्गों में वर्गीकृत करेंगे।\n",
"> इस कोर्स में आगे हम सीखेंगे कि नॉन-लिनियर क्लासिफायर कैसे बनाए जाते हैं, खासकर Neural Networks का उपयोग करके, और उन समस्याओं से कैसे निपटा जाए जब अंक सही तरीके से संरेखित न हों। बहुत जल्द हम MNIST अंक वर्गीकरण में 99% से अधिक सटीकता प्राप्त करेंगे, जबकि उन्हें 10 अलग-अलग वर्गों में वर्गीकृत करेंगे।\n",
"\n",
"## मुख्य बातें\n",
"\n",
" * हमने सबसे सरल न्यूरल नेटवर्क आर्किटेक्चर - एक-लेयर परसेप्ट्रॉन के बारे में सीखा।\n",
" * हमने सबसे सरल Neural Network आर्किटेक्चर - एक-लेयर परसेप्ट्रॉन के बारे में सीखा।\n",
" * हमने परसेप्ट्रॉन को \"हाथ से\" लागू किया, जिसमें साधारण प्रशिक्षण प्रक्रिया का उपयोग किया गया जो ग्रेडिएंट डिसेंट पर आधारित है।\n",
" * सरलता के बावजूद, एक-लेयर परसेप्ट्रॉन हस्तलिखित अंकों की पहचान ी जटिल समस्याओं को हल कर सकता है।\n",
" * एक-लेयर परसेप्ट्रॉन एक रेखीय क्लासिफायर है, और इसलिए यह लॉजिस्टिक रिग्रेशन के समान वर्गीकरण क्षमता प्रदान करता है।\n",
" * सरलता के बावजूद, एक-लेयर परसेप्ट्रॉन हस्तलिखित अंकों की पहचान जैसी जटिल समस्याओं को हल कर सकता है।\n",
" * एक-लेयर परसेप्ट्रॉन एक रेखीय क्लासिफायर है, और इस प्रकार यह लॉजिस्टिक रिग्रेशन के समान वर्गीकरण क्षमता प्रदान करता है।\n",
" * सैंपल स्पेस में, परसेप्ट्रॉन हाइपरप्लेन का उपयोग करके इनपुट डेटा के दो वर्गों को अलग कर सकता है।\n"
]
},
@ -1042,14 +1046,14 @@
"source": [
"## क्रेडिट्स\n",
"\n",
"यह नोटबुक [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners) का हिस्सा है, और इसे [Dmitry Soshnikov](http://soshnikov.com) द्वारा तैयार किया गया है। यह Microsoft Research Cambridge में Neural Network Workshop से प्रेरित है। कुछ कोड और चित्रात्मक सामग्री [Katja Hoffmann](https://www.microsoft.com/en-us/research/people/kahofman/), [Matthew Johnson](https://www.microsoft.com/en-us/research/people/matjoh/) और [Ryoto Tomioka](https://www.microsoft.com/en-us/research/people/ryoto/) की प्रस्तुतियों से ली गई है, और [NeuroWorkshop](http://github.com/shwars/NeuroWorkshop) रिपॉजिटरी से भी।\n"
"यह नोटबुक [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners) का हिस्सा है और इसे [Dmitry Soshnikov](http://soshnikov.com) द्वारा तैयार किया गया है। यह Microsoft Research Cambridge में आयोजित Neural Network Workshop से प्रेरित है। कुछ कोड और चित्रात्मक सामग्री [Katja Hoffmann](https://www.microsoft.com/en-us/research/people/kahofman/), [Matthew Johnson](https://www.microsoft.com/en-us/research/people/matjoh/) और [Ryoto Tomioka](https://www.microsoft.com/en-us/research/people/ryoto/) की प्रस्तुतियों से ली गई है, और [NeuroWorkshop](http://github.com/shwars/NeuroWorkshop) रिपॉजिटरी से भी।\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**अस्वीकरण**: \nयह दस्तावेज़ AI अनुवाद सेवा [Co-op Translator](https://github.com/Azure/co-op-translator) का उपयोग करके अनुवादित किया गया है। जबकि हम सटीकता के लिए प्रयास करते हैं, कृपया ध्यान दें कि स्वचालित अनुवाद में त्रुटियां या अशुद्धियां हो सकती हैं। मूल भाषा में उपलब्ध मूल दस्तावेज़ को आधिकारिक स्रोत माना जाना चाहिए। महत्वपूर्ण जानकारी के लिए, पेशेवर मानव अनुवाद की सिफारिश की जाती है। इस अनुवाद के उपयोग से उत्पन्न किसी भी गलतफहमी या गलत व्याख्या के लिए हम उत्तरदायी नहीं हैं। \n"
"\n---\n\n**अस्वीकरण**: \nयह दस्तावेज़ AI अनुवाद सेवा [Co-op Translator](https://github.com/Azure/co-op-translator) का उपयोग करके अनुवादित किया गया है। जबकि हम सटीकता के लिए प्रयास करते हैं, कृपया ध्यान दें कि स्वचालित अनुवाद में त्रुटियां या अशुद्धियां हो सकती हैं। मूल भाषा में उपलब्ध मूल दस्तावेज़ को आधिकारिक स्रोत माना जाना चाहिए। महत्वपूर्ण जानकारी के लिए, पेशेवर मानव अनुवाद की सिफारिश की जाती है। इस अनुवाद के उपयोग से उत्पन्न किसी भी गलतफहमी या गलत व्याख्या के लिए हम उत्तरदायी नहीं हैं।\n"
]
}
],
@ -1078,8 +1082,8 @@
"start_slideshow_at": "selected"
},
"coopTranslator": {
"original_hash": "914fc55f59efc7e17b8130d4033ac617",
"translation_date": "2025-08-31T15:00:44+00:00",
"original_hash": "d67e5b54ba20b507aa88d71aa3d042d8",
"translation_date": "2025-10-03T13:16:55+00:00",
"source_file": "lessons/3-NeuralNetworks/03-Perceptron/Perceptron.ipynb",
"language_code": "hi"
}

View File

@ -11,11 +11,11 @@
"source": [
"## 感知器\n",
"\n",
"> 此筆記本是 [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners) 的一部分。請訪問該存儲庫以獲取完整的學習材料。\n",
"> 此筆記本是 [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners) 的一部分。請訪問該倉庫以獲取完整的學習資料。\n",
"\n",
"如我們所討論,感知器可以用來解決**二元分類問題**,即將輸入範例分類為兩個類別——我們可以稱它們為**正類**和**負類**。\n",
"如我們所討論,感知器可以用來解決**二元分類問題**,即將輸入範例分類為兩個類別——我們可以稱為**正類**和**負類**。\n",
"\n",
"首先,讓我們導入一些所需的庫。\n"
"首先,讓我們導入一些必要的庫。\n"
]
},
{
@ -49,7 +49,7 @@
"source": [
"## 玩具問題\n",
"\n",
"首先,我們從一個簡單的玩具問題開始,這個問題有兩個輸入特徵。例如,在醫學中,我們可能希望根據腫瘤的大小和年齡將其分類為良性或惡性。\n",
"首先,我們從一個玩具問題開始,這個問題有兩個輸入特徵。例如,在醫學中,我們可能希望根據腫瘤的大小和年齡將其分類為良性或惡性。\n",
"\n",
"我們將使用 SciKit Learn 庫中的 `make_classification` 函數生成一個隨機分類數據集:\n"
]
@ -158,7 +158,7 @@
"\n",
"$$y(\\mathbf{x}) = f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x})$$\n",
"\n",
"其中 $\\mathbf{w}$ 是權重向量,$f$ 是一個階梯激活函數:\n",
"其中 $\\mathbf{w}$ 是權重向量,$f$ 是階梯激活函數:\n",
"$$\n",
"f(x) = \\begin{cases}\n",
" +1 & x \\geq 0 \\\\\n",
@ -166,7 +166,7 @@
" \\end{cases} \\\\\n",
"$$\n",
"\n",
"然而,一個通用的線性模型應該也包含一個偏置項,也就是說,理想情況下我們應該將 $y$ 計算為 $y=f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}+\\mathbf{b})$。為了簡化我們的模型,我們可以通過在輸入特徵中添加一個始終等於 1 的維度來去這個偏置項:\n"
"然而,一般的線性模型應該也包含一個偏置項,也就是說,理想情況下我們應該計算 $y$ 為 $y=f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}+\\mathbf{b})$。為了簡化模型,我們可以通過在輸入特徵中添加一個始終等於 1 的維度來去這個偏置項:\n"
]
},
{
@ -206,20 +206,20 @@
"source": [
"## 訓練算法\n",
"\n",
"為了訓練感知器,我們需要找出權重 $\\mathbf{w}$,以最小化錯誤。錯誤是使用**感知器準則**定義的:\n",
"為了訓練感知器,我們需要找到權重 $\\mathbf{w}$,以最小化誤差。誤差是通過**感知器準則**定義的:\n",
"\n",
"$$E(\\mathbf{w}) = -\\sum_{n \\in \\mathcal{M}}\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}_{n}t_{n}$$\n",
" \n",
" * $t_{n} \\in \\{-1, +1\\}$ 分別代表負樣本和正樣本\n",
" * $t_{n} \\in \\{-1, +1\\}$ 分別對應於負樣本和正樣本\n",
" * $\\mathcal{M}$ - 錯誤分類的樣本集合\n",
" \n",
"我們將使用**梯度下降**的過程。從一些初始隨機權重 $\\mathbf{w}^{(0)}$ 開始,我們會在訓練的每一步根據 $E$ 的梯度調整權重:\n",
"我們將使用**梯度下降**的過程。從一些初始隨機權重 $\\mathbf{w}^{(0)}$ 開始,我們會在訓練的每一步根據 $E$ 的梯度調整權重:\n",
"\n",
"$$\\mathbf{w}^{\\tau + 1}=\\mathbf{w}^{\\tau} - \\eta \\nabla E(\\mathbf{w}) = \\mathbf{w}^{\\tau} + \\eta\\sum_{n \\in \\mathcal{M}}\\mathbf{x}_{n} t_{n}$$\n",
"\n",
"其中 $\\eta$ 是**學習率**$\\tau\\in\\mathbb{N}$ 是迭代次數。\n",
"\n",
"以下是用 Python 定義此算法\n"
"以下是用 Python 定義該算法的程式碼\n"
]
},
{
@ -271,7 +271,9 @@
{
"cell_type": "markdown",
"metadata": {},
"source": []
"source": [
"現在讓我們在我們的數據集上進行訓練:\n"
]
},
{
"cell_type": "code",
@ -309,9 +311,9 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"如你所見,初始準確率約為 50%,但很快便提升至接近 90% 的高值。\n",
"如你所見,初始準確率約為 50%,但很快提升至接近 90% 的高值。\n",
"\n",
"現在讓我們視覺化地觀察類別是如何分開的。我們的分類函數表現為 $\\mathbf{w}^Tx$,當其大於 0 時屬於一個類別,當其小於 0 時屬於另一個類別。因此,類別分界線由 $\\mathbf{w}^Tx = 0$ 定義。由於我們只有兩個維度 $x_0$ 和 $x_1$,該直線的方程式為 $w_0x_0+w_1x_1+w_2 = 0$(記住,我們已明確定義了一個額外的維度 $x_2=1$)。現在讓我們繪製這條直線:\n"
"現在讓我們來看看類別是如何分隔的。我們的分類函數形式為 $\\mathbf{w}^Tx$,對於某一類別,其值大於 0而對於另一類別其值則小於 0。因此類別分隔線由 $\\mathbf{w}^Tx = 0$ 定義。由於我們只有兩個維度 $x_0$ 和 $x_1$,該直線的方程式為 $w_0x_0+w_1x_1+w_2 = 0$(記我們已明確定義了一個額外的維度 $x_2=1$)。現在讓我們繪製這條直線:\n"
]
},
{
@ -379,7 +381,7 @@
"source": [
"## 在測試數據集上進行評估\n",
"\n",
"一開始,我們已經將部分數據分離出來作為測試數據集。現在讓我們看看分類器在這個測試數據集上的準確度如何。為了做到這一點,我們需要將測試數據集擴展一個額外的維度,乘上權重矩陣,並確保得到的值與標籤的符號一致(+1 或 -1。接著我們將所有布值相加,並除以測試樣本的長度,從而得準確度:\n"
"一開始,我們已經將部分數據分離到測試數據集中。現在來看看我們的分類器在這個測試數據集上的準確度如何。為了做到這一點,我們需要將測試數據集擴展一個額外的維度,乘上權重矩陣,並確保得到的值與標籤的符號一致(+1 或 -1。接著我們將所有布值相加,並除以測試樣本的長度,從而得準確度:\n"
]
},
{
@ -420,7 +422,7 @@
"source": [
"## 觀察訓練過程\n",
"\n",
"我們之前已經看到,準確率在訓練過程中會下降。能夠觀察分隔線在訓練期間的變化會很有趣。以下的程式碼會將所有內容可視化在一個圖表上,並且你應該能夠通過移動滑桿來「穿越時間」觀察訓練過程。\n"
"我們之前已經看到,準確率在訓練過程中會下降。能夠看到分隔線在訓練過程中的變化會很有趣。以下的程式碼將把所有內容可視化在一個圖表上,您可以移動滑塊來“時光旅行”觀察訓練過程。\n"
]
},
{
@ -525,9 +527,9 @@
}
},
"source": [
"## 感知器的局限性\n",
"## 感知器的限制\n",
"\n",
"如上所述,感知器是一種**線性分類器**。如果兩個類別是**線性可分**的,也就是可以用一條直線分隔,那麼感知器可以很好地區分它們。否則,感知器的訓練過程將無法收斂。\n",
"如上所述,感知器是一種**線性分類器**。如果兩個類別是**線性可分**的,也就是可以用一條直線分開,那麼它可以很好地區分這兩個類別。否則,感知器的訓練過程將無法收斂。\n",
"\n",
"一個最明顯的例子是感知器無法解決的問題,即所謂的**XOR問題**。我們希望感知器能學習XOR布爾函數其真值表如下\n",
"\n",
@ -603,21 +605,21 @@
}
},
"source": [
"從上圖可以看到,準確率從未超過 75%,因為不可能畫出一條直線來正確覆蓋所有可能的例子。\n",
"如上圖所示準確率從未超過75%,因為不可能畫出一條直線來正確分類所有可能的例子。\n",
"\n",
"XOR 問題是感知器perceptron局限性的經典例子,這一點在 1969 年由 Marvin Minsky Seymour Papert 在他們的書籍 [Perceptrons](https://en.wikipedia.org/wiki/Perceptrons_(book)) 中指出。這一觀察限制了神經網絡領域的研究近 10 年,儘管——我們會在課程的下一部分看到——多層感知器完全有能力解決這類問題。\n",
"XOR問題是感知器局限性的經典例子這一點在1969年由Marvin Minsky和Seymour Papert在他們的書籍[Perceptrons](https://en.wikipedia.org/wiki/Perceptrons_(book))中指出。這一觀察限制了神經網絡領域的研究近10年儘管——我們會在課程的下一部分看到——多層感知器完全能夠解決這類問題。\n",
"\n",
"## 複雜例 - MNIST\n",
"## 複雜例 - MNIST\n",
"\n",
"雖然感知器無法解決 XOR 問題,但它可以解決許多更複雜的問題,例如手寫字符識別。\n",
"雖然感知器無法解決XOR問題但它可以解決許多更複雜的問題例如手寫字符識別。\n",
"\n",
"在學習機器學習時,經常使用的一個數據集叫做 [MNIST](https://en.wikipedia.org/wiki/MNIST_database)。這個數據集由美國國家標準與技術研究所Modified National Institute of Standards and Technology創建包含一個由 60000 個手寫數字組成的訓練集,這些數字來自研究所 250 名學生和員工。此外,還有一個由 10000 個數字組成的測試數據集,這些數字來自不同的個體。\n",
"在學習機器學習時,經常使用的一個數據集叫做[MNIST](https://en.wikipedia.org/wiki/MNIST_database)。它由美國國家標準技術研究所Modified National Institute of Standards and Technology創建包含一個由60000個手寫數字組成的訓練集這些數字來自研究所約250名學生和員工。此外還有一個由10000個數字組成的測試數據集這些數字來自不同的個體。\n",
"\n",
"所有數字都以 28x28 像素的灰度圖像表示。\n",
"所有數字都以28x28像素的灰度圖像表示。\n",
"\n",
"> MNIST 數據集作為一個訓練競賽可在 [Kaggle](https://www.kaggle.com/c/digit-recognizer) 上找到,這是一個舉辦機器學習競賽和比賽的網站。一旦你學會如何分類 MNIST 數字,你可以將你的解決方案提交到 Kaggle看看它在其他參賽者中的排名。\n",
"> MNIST數據集作為一個訓練競賽可在[Kaggle](https://www.kaggle.com/c/digit-recognizer)上找到Kaggle是一個舉辦機器學習競賽和比賽的網站。一旦你學會如何分類MNIST數字你可以將你的解決方案提交到Kaggle看看它在其他參賽者中的排名。\n",
"\n",
"我們從載入 MNIST 數據集開始\n"
"我們首先加載MNIST數據集\n"
]
},
{
@ -693,7 +695,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"因為感知器是一個二元分類器,我們將把問題限制為只識別兩個數字。以下的函數將用兩個給定的數字填充正樣本和負樣本數組(並且會顯示這些數字的樣本以便清楚了解)。\n"
"因為感知器是一個二元分類器,我們將把問題限制為僅識別兩個數字。以下函數將使用兩個給定的數字填充正樣本和負樣本數組(並且會顯示這些數字的樣本以便清楚了解)。\n"
]
},
{
@ -733,7 +735,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"我們將開始嘗試在 0 和 1 之間進行分類\n"
"我們將從嘗試在 0 和 1 之間進行分類開始\n"
]
},
{
@ -829,11 +831,11 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"請注意,準確度會非常快速地接近 100%。\n",
"請注意準確度會非常快速地接近100%。\n",
"\n",
"請將滑桿移動到訓練過程接近尾聲的位置,並觀察左側的權重矩陣。這個矩陣能幫助你理解感知器的運作方式。你可以看到矩陣中間部分的權重值很高,這些對應於數字 1 通常出現的像素位置;而矩陣兩側的權重值則是低的負數,這些對應於數字 0 的部分。因此,如果感知器接收到的數字確實是 1中間部分的像素會與高權重值相乘產生正的結果。相反地當感知器觀察到數字 0時對應的像素會與負數相乘。\n",
"請將滑桿移動到訓練過程接近尾聲的位置,並觀察左側繪製的權重矩陣。這個矩陣可以幫助你理解感知器的實際運作方式。你可以看到矩陣中間的高權重值這些值對應於通常出現在數字1中的像素而矩陣兩側則是低的負值這些位置通常是數字0的一部分。因此如果呈現給感知器的數字確實是1中間部分的像素會被高權重值相乘產生正的結果。相反地當感知器觀察到數字0時對應的像素會被負數相乘。\n",
"\n",
"> 你可能會注意到,如果我們給感知器一個稍微水平移動的數字 1使其像素佔據了數字 0 垂直部分的位置,我們可能會得到錯誤的結果。由於 MNIST 數據集的特性是所有數字都居中且定位正確,感知器依賴這一特性來區分數字。\n",
"> 你可能會注意到,如果我們給感知器一個稍微水平移動的數字1使其像素佔據了數字0的垂直部分位置我們可能會得到錯誤的結果。由於MNIST數據集的特性是所有數字都居中且定位正確感知器依賴這一特性來區分不同的數字。\n",
"\n",
"現在讓我們嘗試不同的數字:\n"
]
@ -911,11 +913,11 @@
"source": [
"## 討論\n",
"\n",
"某些原因導致 2 和 5 不容易分開。即使我們的準確率相對較高(超過 85%),我們仍然可以明顯看到感知器在某個時刻停止學習。\n",
"不知何故,數字 2 和 5 並不容易分開。即使我們的準確率相對較高(超過 85%),我們仍然可以明顯看到感知器在某個時刻停止學習。\n",
"\n",
"為了理解為什麼會發生這種情況,我們可以嘗試使用[主成分分析](https://en.wikipedia.org/wiki/Principal_component_analysis) (PCA)。這是一種機器學習技術,用於降低輸入數據集的維度,以便在類別之間獲得最佳的可分性。\n",
"為了理解為什麼會發生這種情況,我們可以嘗試使用[主成分分析](https://en.wikipedia.org/wiki/Principal_component_analysis) (PCA)。這是一種機器學習技術,用於降低輸入數據集的維度,以便獲得最佳的類別可分性。\n",
"\n",
"在我們的例子中,輸入圖像有 784 個像素(輸入特徵),我們希望使用 PCA 將參數數量減少到僅僅 2 個,這樣我們就可以在圖表上繪製它們。這兩個參數將是原始特徵的線性組合,我們可以將這個過程視為「旋轉」我們原本的 784 維空間,並觀察其投影到 2D 空間的結果,直到我們獲得最佳的視角來分離類別。\n"
"在我們的例子中,輸入圖像有 784 個像素(輸入特徵),我們希望使用 PCA 將參數數量減少到僅僅 2 個,這樣我們就可以在圖表上繪製它們。這兩個參數將是原始特徵的線性組合,我們可以將這個過程視為“旋轉”我們原本的 784 維空間,並觀察其在 2D 空間中的投影,直到我們獲得最佳視角來分離類別。\n"
]
},
{
@ -1025,17 +1027,17 @@
}
},
"source": [
"如你所見0 和 1 可以用一條直線清楚地分隔開來。這表明在原本的 784 維空間中,對應於數字的點也是線性可分的。而在 2 和 5 的情況下,我們無法找到一個良好的投影來清楚地分隔這些數字,因此會出現一些錯誤分類的情況。\n",
"如你所見0 和 1 可以用一條直線清楚地分隔開來。這表明在原始的784維空間中與數字對應的點也是線性可分的。而在2和5的情況下我們無法找到能清楚分隔這些數字的良好投影,因此會出現一些錯誤分類的情況。\n",
"\n",
"> 在這門課程的後續部分,我們將學習如何使用神經網絡創建非線性分類器,以及如何處理數字未能正確對齊的問題。不久之後,我們將在 MNIST 數字分類中達到超過 99% 的準確率,並將它們分類為 10 個不同的類別。\n",
"> 在這門課程的後續部分,我們將學習如何使用神經網絡創建非線性分類器,以及如何處理數字未正確對齊的問題。很快我們將在MNIST數字分類中達到超過99%的準確率同時將數字分類為10個不同的類別。\n",
"\n",
"## 重點回顧\n",
"## 重點\n",
"\n",
" * 我們學習了最簡單的神經網絡架構——單層感知器。\n",
" * 我們通過手動實現了感知器,使用基於梯度下降的簡單訓練程序。\n",
" * 儘管簡單,單層感知器仍然可以解決相當複雜的手寫數字識別問題。\n",
" * 單層感知器是一個線性分類器,因此它提供的分類能力與邏輯回歸相同。\n",
" * 在樣本空間中,感知器可以使用超平面分隔輸入數據的兩個類別。\n"
" * 我們通過簡單的基於梯度下降的訓練過程,\"手動\"實現了感知器。\n",
" * 儘管簡單,單層感知器可以解決相當複雜的手寫數字識別問題。\n",
" * 單層感知器是一個線性分類器,因此它提供了與邏輯回歸相同的分類能力。\n",
" * 在樣本空間中,感知器可以使用超平面分隔兩類輸入數據。\n"
]
},
{
@ -1044,14 +1046,14 @@
"source": [
"## 致謝\n",
"\n",
"此筆記本是 [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners) 的一部分,由 [Dmitry Soshnikov](http://soshnikov.com) 編寫靈感來自於微軟劍橋研究院的神經網絡工作坊。一些代碼和示例材料取自 [Katja Hoffmann](https://www.microsoft.com/en-us/research/people/kahofman/)、[Matthew Johnson](https://www.microsoft.com/en-us/research/people/matjoh/) 和 [Ryoto Tomioka](https://www.microsoft.com/en-us/research/people/ryoto/) 的演示文稿,以及 [NeuroWorkshop](http://github.com/shwars/NeuroWorkshop) 資源庫。\n"
"此筆記本是 [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners) 的一部分,由 [Dmitry Soshnikov](http://soshnikov.com) 編寫靈感來自於微軟劍橋研究院的神經網絡工作坊。一些代碼和示例材料取自 [Katja Hoffmann](https://www.microsoft.com/en-us/research/people/kahofman/)、[Matthew Johnson](https://www.microsoft.com/en-us/research/people/matjoh/) 和 [Ryoto Tomioka](https://www.microsoft.com/en-us/research/people/ryoto/) 的演示文稿,以及 [NeuroWorkshop](http://github.com/shwars/NeuroWorkshop) 資源庫。\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**免責聲明** \n文件已使用人工智能翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。儘管我們致力於提供準確的翻譯,但請注意,自動翻譯可能包含錯誤或不準確之處。原始語言的文件應被視為權威來源。對於重要信息,建議使用專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或錯誤解釋概不負責。\n"
"\n---\n\n**免責聲明** \n文件已使用人工智能翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。我們致力於提供準確的翻譯,但請注意,自動翻譯可能包含錯誤或不準確之處。應以原文檔的母語版本作為權威來源。對於關鍵資訊,建議尋求專業的人工作翻譯。我們對因使用此翻譯而引起的任何誤解或錯誤解讀概不負責。\n"
]
}
],
@ -1080,8 +1082,8 @@
"start_slideshow_at": "selected"
},
"coopTranslator": {
"original_hash": "914fc55f59efc7e17b8130d4033ac617",
"translation_date": "2025-08-31T10:16:03+00:00",
"original_hash": "d67e5b54ba20b507aa88d71aa3d042d8",
"translation_date": "2025-10-03T13:12:53+00:00",
"source_file": "lessons/3-NeuralNetworks/03-Perceptron/Perceptron.ipynb",
"language_code": "hk"
}

View File

@ -13,7 +13,7 @@
"\n",
"> Ova bilježnica dio je [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners). Posjetite repozitorij za kompletan set materijala za učenje.\n",
"\n",
"Kao što smo već raspravili, perceptron vam omogućuje rješavanje problema **binarne klasifikacije**, tj. klasificiranje ulaznih primjera u dvije klase - možemo ih nazvati **pozitivne** i **negativne**.\n",
"Kao što smo već raspravili, perceptron vam omogućuje rješavanje problema **binarne klasifikacije**, tj. klasifikaciju ulaznih primjera u dvije klase - možemo ih nazvati **pozitivne** i **negativne**.\n",
"\n",
"Prvo, importirajmo neke potrebne biblioteke.\n"
]
@ -47,9 +47,9 @@
}
},
"source": [
"## Igraći problem\n",
"## Problem s igračkom\n",
"\n",
"Za početak, krenimo s jednostavnim problemom, gdje imamo dvije ulazne značajke. Na primjer, u medicini možda želimo klasificirati tumore kao benigne ili maligne, ovisno o njihovoj veličini i starosti.\n",
"Za početak, krenimo s problemom s igračkom, gdje imamo dvije ulazne značajke. Na primjer, u medicini možda želimo klasificirati tumore kao benigne ili maligne, ovisno o njihovoj veličini i starosti.\n",
"\n",
"Generirat ćemo nasumični skup podataka za klasifikaciju koristeći funkciju `make_classification` iz biblioteke SciKit Learn:\n"
]
@ -166,7 +166,7 @@
" \\end{cases} \\\\\n",
"$$\n",
"\n",
"Međutim, generički linearni model također bi trebao imati pristranost (bias), tj. idealno bismo trebali računati $y$ kao $y=f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}+\\mathbf{b})$. Kako bismo pojednostavili naš model, možemo se riješiti ovog termina pristranosti dodavanjem još jedne dimenzije našim ulaznim značajkama, koja uvijek ima vrijednost 1:\n"
"Međutim, generički linearni model također bi trebao imati pomak (bias), tj. idealno bismo trebali računati $y$ kao $y=f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}+\\mathbf{b})$. Kako bismo pojednostavili naš model, možemo se riješiti ovog pomaka dodavanjem još jedne dimenzije našim ulaznim značajkama, koja uvijek ima vrijednost 1:\n"
]
},
{
@ -204,16 +204,16 @@
}
},
"source": [
"## Algoritam za treniranje\n",
"## Algoritam treniranja\n",
"\n",
"Kako bismo trenirali perceptron, trebamo pronaći težine $\\mathbf{w}$ koje će minimizirati pogrešku. Pogreška je definirana pomoću **kriterija perceptrona**:\n",
"Kako bismo trenirali perceptron, potrebno je pronaći težine $\\mathbf{w}$ koje će minimizirati pogrešku. Pogreška se definira pomoću **kriterija perceptrona**:\n",
"\n",
"$$E(\\mathbf{w}) = -\\sum_{n \\in \\mathcal{M}}\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}_{n}t_{n}$$\n",
" \n",
" * $t_{n} \\in \\{-1, +1\\}$ za negativne i pozitivne primjere za treniranje, redom\n",
" * $t_{n} \\in \\{-1, +1\\}$ za negativne i pozitivne primjere u skupu za treniranje\n",
" * $\\mathcal{M}$ - skup pogrešno klasificiranih primjera\n",
" \n",
"Koristit ćemo proces **gradijentnog spuštanja**. Počevši s nekim početnim slučajnim težinama $\\mathbf{w}^{(0)}$, prilagođavat ćemo težine na svakom koraku treniranja koristeći gradijent $E$:\n",
"Koristit ćemo proces **gradijentnog spuštanja**. Počevši s početnim slučajnim težinama $\\mathbf{w}^{(0)}$, prilagođavat ćemo težine u svakom koraku treniranja koristeći gradijent $E$:\n",
"\n",
"$$\\mathbf{w}^{\\tau + 1}=\\mathbf{w}^{\\tau} - \\eta \\nabla E(\\mathbf{w}) = \\mathbf{w}^{\\tau} + \\eta\\sum_{n \\in \\mathcal{M}}\\mathbf{x}_{n} t_{n}$$\n",
"\n",
@ -271,7 +271,9 @@
{
"cell_type": "markdown",
"metadata": {},
"source": []
"source": [
"Sada pokrenimo treniranje na našem skupu podataka:\n"
]
},
{
"cell_type": "code",
@ -311,7 +313,7 @@
"source": [
"Kao što možete vidjeti, početna točnost je oko 50%, ali brzo raste do viših vrijednosti blizu 90%.\n",
"\n",
"Vizualizirajmo kako su klase razdvojene. Naša funkcija klasifikacije izgleda kao $\\mathbf{w}^Tx$, i veća je od 0 za jednu klasu, a manja od 0 za drugu. Dakle, linija razdvajanja klasa definirana je s $\\mathbf{w}^Tx = 0$. Budući da imamo samo dvije dimenzije $x_0$ i $x_1$, jednadžba za liniju bila bi $w_0x_0+w_1x_1+w_2 = 0$ (sjetite se da smo eksplicitno definirali dodatnu dimenziju $x_2=1$). Nacrtajmo ovu liniju:\n"
"Vizualizirajmo kako su klase razdvojene. Naša funkcija klasifikacije izgleda kao $\\mathbf{w}^Tx$, i veća je od 0 za jednu klasu, a manja od 0 za drugu. Dakle, linija razdvajanja klasa definirana je s $\\mathbf{w}^Tx = 0$. Budući da imamo samo dvije dimenzije $x_0$ i $x_1$, jednadžba za liniju bila bi $w_0x_0+w_1x_1+w_2 = 0$ (zapamtite da smo eksplicitno definirali dodatnu dimenziju $x_2=1$). Nacrtajmo ovu liniju:\n"
]
},
{
@ -379,7 +381,7 @@
"source": [
"## Procjena na testnom skupu podataka\n",
"\n",
"Na početku smo izdvojili dio podataka za testni skup podataka. Pogledajmo koliko je naš klasifikator točan na ovom testnom skupu. Da bismo to učinili, proširujemo testni skup podataka s dodatnom dimenzijom, množimo ga s matricom težina i provjeravamo je li dobivena vrijednost istog predznaka kao i oznaka (+1 ili -1). Zatim zbrajamo sve logičke vrijednosti i dijelimo s duljinom testnog uzorka kako bismo dobili točnost:\n"
"Na početku smo izdvojili dio podataka za testni skup podataka. Pogledajmo koliko je naš klasifikator točan na ovom testnom skupu podataka. Da bismo to učinili, proširujemo testni skup podataka dodatnom dimenzijom, množimo ga s matricom težina i provjeravamo je li dobivena vrijednost istog predznaka kao i oznaka (+1 ili -1). Zatim zbrajamo sve logičke vrijednosti i dijelimo ih s duljinom testnog uzorka kako bismo dobili točnost:\n"
]
},
{
@ -527,16 +529,16 @@
"source": [
"## Ograničenja perceptrona\n",
"\n",
"Kao što ste vidjeli gore, perceptron je **linearni klasifikator**. Može dobro razlikovati dvije klase ako su **linearnо razdvojive**, tj. ako ih je moguće razdvojiti ravnom linijom. U suprotnom, proces treniranja perceptrona neće konvergirati.\n",
"Kao što ste vidjeli gore, perceptron je **linearni klasifikator**. Može dobro razlikovati između dvije klase ako su **linearno odvojive**, tj. mogu se razdvojiti ravnom crtom. U suprotnom, proces treniranja perceptrona neće konvergirati.\n",
"\n",
"Najočitiji primjer problema koji perceptron ne može riješiti je takozvani **XOR problem**. Želimo da naš perceptron nauči XOR booleovu funkciju, koja ima sljedeću tablicu istinitosti:\n",
"Najjasniji primjer problema koji se ne može riješiti perceptronom je takozvani **XOR problem**. Želimo da naš perceptron nauči logičku funkciju XOR, koja ima sljedeću tablicu istinitosti:\n",
"\n",
"| | 0 | 1 |\n",
"|---|---|---|\n",
"| 0 | 0 | 1 | \n",
"| 1 | 1 | 0 |\n",
"\n",
"Pokušajmo to učiniti! Ručno ćemo popuniti sve pozitivne i negativne uzorke za treniranje, a zatim pozvati našu funkciju treniranja definiranu gore:\n"
"Pokušajmo to učiniti! Ručno ćemo popuniti sve pozitivne i negativne uzorke za treniranje, a zatim pozvati našu funkciju za treniranje definiranu gore:\n"
]
},
{
@ -603,19 +605,19 @@
}
},
"source": [
"Kao što možete vidjeti iz gornjeg grafikona, točnost nikada ne prelazi 75%, jer je nemoguće povući ravnu liniju na način da se svi mogući primjeri riješe ispravno.\n",
"Kao što možete vidjeti iz gornjeg grafikona, točnost nikada ne prelazi 75%, jer je nemoguće povući ravnu liniju na način da se svi primjeri točno klasificiraju.\n",
"\n",
"Problem XOR klasičan je primjer ograničenja perceptrona, a na njega su ukazali Marvin Minsky i Seymour Papert 1969. godine u svojoj knjizi [Perceptrons](https://en.wikipedia.org/wiki/Perceptrons_(book)). Ovo opažanje ograničilo je istraživanja u području neuronskih mreža gotovo 10 godina, iako - kao što ćemo vidjeti u sljedećem dijelu našeg tečaja - višeslojni perceptroni savršeno mogu riješiti takve probleme.\n",
"Problem XOR klasičan je primjer ograničenja perceptrona, a na njega su ukazali Marvin Minsky i Seymour Papert 1969. godine u svojoj knjizi [Perceptrons](https://en.wikipedia.org/wiki/Perceptrons_(book)). Ovo zapažanje ograničilo je istraživanja u području neuronskih mreža gotovo 10 godina, iako - kao što ćemo vidjeti u sljedećem dijelu našeg tečaja - višeslojni perceptroni savršeno mogu riješiti takve probleme.\n",
"\n",
"## Složen primjer - MNIST\n",
"## Složeniji primjer - MNIST\n",
"\n",
"Iako perceptron ne može riješiti problem XOR, može riješiti mnoge složenije probleme, poput prepoznavanja rukom pisanih znakova.\n",
"\n",
"Skup podataka koji se često koristi pri učenju strojnog učenja zove se [MNIST](https://en.wikipedia.org/wiki/MNIST_database). Kreirao ga je Modificirani Nacionalni Institut za Standarde i Tehnologiju, a sadrži skup za treniranje od 60000 rukom pisanih znamenki, prikupljenih od oko 250 studenata i zaposlenika instituta. Također postoji testni skup podataka od 10000 znamenki, prikupljenih od različitih pojedinaca.\n",
"Skup podataka koji se često koristi za usvajanje strojnog učenja zove se [MNIST](https://en.wikipedia.org/wiki/MNIST_database). Kreiran je od strane Modificiranog Nacionalnog Instituta za Standarde i Tehnologiju te sadrži skup za treniranje od 60.000 rukom pisanih znamenki, prikupljenih od oko 250 studenata i zaposlenika instituta. Također postoji testni skup podataka od 10.000 znamenki, prikupljenih od različitih pojedinaca.\n",
"\n",
"Sve znamenke predstavljene su sivim slikama veličine 28x28 piksela.\n",
"\n",
"> Skup podataka MNIST dostupan je kao natjecanje za treniranje na [Kaggle](https://www.kaggle.com/c/digit-recognizer), stranici koja organizira natjecanja i izazove u strojnome učenju. Kada naučite kako klasificirati znamenke iz MNIST skupa, možete poslati svoje rješenje na Kaggle kako biste vidjeli kako se ocjenjuje među ostalim sudionicima.\n",
"> Skup podataka MNIST dostupan je kao natjecanje za treniranje na [Kaggle](https://www.kaggle.com/c/digit-recognizer), stranici koja organizira natjecanja i izazove u strojnome učenju. Kada naučite klasificirati znamenke iz MNIST skupa podataka, možete poslati svoje rješenje na Kaggle kako biste vidjeli kako se ocjenjuje među ostalim sudionicima.\n",
"\n",
"Počinjemo učitavanjem MNIST skupa podataka:\n"
]
@ -693,7 +695,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Budući da je perceptron binarni klasifikator, ograničit ćemo naš problem na prepoznavanje samo dvije znamenke. Funkcija ispod će popuniti pozitivne i negativne nizove uzoraka s dvije zadane znamenke (i također će prikazati uzorke tih znamenki radi jasnoće).\n"
"Budući da je perceptron binarni klasifikator, ograničit ćemo naš problem na prepoznavanje samo dvije znamenke. Funkcija ispod će popuniti nizove pozitivnih i negativnih uzoraka s dvije zadane znamenke (i također će prikazati uzorke tih znamenki radi jasnoće).\n"
]
},
{
@ -829,9 +831,11 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Molimo, pomaknite klizač prema kraju treninga i promatrajte matricu težina prikazanu s lijeve strane. Ova matrica omogućit će vam da razumijete kako perceptron zapravo funkcionira. Možete vidjeti visoke vrijednosti težina u sredini polja, koje odgovaraju pikselima koji su obično prisutni za znamenku 1, i niske negativne vrijednosti sa strane, gdje se nalaze dijelovi znamenke 0. Dakle, ako je znamenka prikazana perceptronu zapravo 1, srednji dio će se pomnožiti s visokim vrijednostima, što će rezultirati pozitivnim ishodom. Suprotno tome, kada perceptron promatra znamenku 0, odgovarajući pikseli će se pomnožiti s negativnim brojevima.\n",
"Imajte na umu kako točnost vrlo brzo raste gotovo do 100%.\n",
"\n",
"> Možete primijetiti da, ako našem perceptronu damo znamenku 1 koja je malo pomaknuta horizontalno, tako da njezini pikseli zauzimaju mjesto gdje se nalaze vertikalni dijelovi znamenke 0, možemo dobiti netočan rezultat. Budući da je priroda našeg MNIST skupa podataka takva da su sve znamenke centrirane i pravilno pozicionirane, perceptron se oslanja na to kako bi razlikovao znamenke.\n",
"Molimo, pomaknite klizač na neku poziciju prema kraju treninga i promatrajte matricu težina prikazanu s lijeve strane. Ova matrica omogućit će vam da razumijete kako perceptron zapravo funkcionira. Možete vidjeti visoke vrijednosti težina u sredini polja, koje odgovaraju pikselima koji su obično prisutni za znamenku 1, i niske negativne vrijednosti sa strane, gdje se nalaze dijelovi znamenke 0. Dakle, ako je znamenka prikazana perceptronu zapravo 1, njezin srednji dio bit će pomnožen visokim vrijednostima, što će rezultirati pozitivnim ishodom. Suprotno tome, kada perceptron promatra znamenku 0, odgovarajući pikseli bit će pomnoženi negativnim brojevima.\n",
"\n",
"> Možete primijetiti da ako našem perceptronu damo znamenku 1 koja je malo pomaknuta horizontalno, tako da njezini pikseli zauzimaju mjesto gdje se nalaze vertikalni dijelovi znamenke 0, možemo dobiti netočan rezultat. Budući da je priroda našeg MNIST skupa podataka takva da su sve znamenke centrirane i pravilno pozicionirane, perceptron se oslanja na to kako bi razlikovao znamenke.\n",
"\n",
"Sada pokušajmo s različitim znamenkama:\n"
]
@ -909,11 +913,11 @@
"source": [
"## Rasprava\n",
"\n",
"Iz nekog razloga, 2 i 5 nisu tako lako odvojivi. Iako postižemo relativno visoku točnost (iznad 85%), jasno možemo vidjeti kako perceptron u nekom trenutku prestaje učiti.\n",
"Iz nekog razloga, brojevi 2 i 5 nisu tako lako odvojivi. Iako postižemo relativno visoku točnost (iznad 85%), jasno možemo vidjeti kako perceptron u nekom trenutku prestaje učiti.\n",
"\n",
"Kako bismo razumjeli zašto se to događa, možemo pokušati koristiti [Analizu glavnih komponenti](https://en.wikipedia.org/wiki/Principal_component_analysis) (PCA). To je tehnika strojnog učenja koja se koristi za smanjenje dimenzionalnosti ulaznog skupa podataka, na način da se postigne najbolja odvojivost između klasa.\n",
"\n",
"U našem slučaju, ulazna slika ima 784 piksela (ulazne značajke), a želimo koristiti PCA kako bismo smanjili broj parametara na samo 2, tako da ih možemo prikazati na grafu. Ta dva parametra bila bi linearna kombinacija originalnih značajki, a ovaj postupak možemo promatrati kao \"rotaciju\" našeg originalnog 784-dimenzionalnog prostora i promatranje njegove projekcije u 2D-prostor, sve dok ne dobijemo najbolji prikaz koji razdvaja klase.\n"
"U našem slučaju, ulazna slika ima 784 piksela (ulazne značajke), a mi želimo koristiti PCA kako bismo smanjili broj parametara na samo 2, tako da ih možemo prikazati na grafu. Ta dva parametra bila bi linearna kombinacija originalnih značajki, a ovaj postupak možemo promatrati kao \"rotiranje\" našeg originalnog 784-dimenzionalnog prostora i promatranje njegove projekcije na 2D-prostor, sve dok ne dobijemo najbolji prikaz koji razdvaja klase.\n"
]
},
{
@ -1023,17 +1027,17 @@
}
},
"source": [
"Kao što možete vidjeti, 0 i 1 mogu se jasno odvojiti ravnom linijom. To pokazuje da su u izvornom 784-dimenzionalnom prostoru točke koje odgovaraju znamenkama također linearno odvojive. U slučaju 2 i 5, ne možemo pronaći dobru projekciju koja će jasno odvojiti znamenke, pa stoga postoje slučajevi pogrešne klasifikacije.\n",
"Kao što možete vidjeti, 0 i 1 mogu se jasno odvojiti ravnom linijom. To pokazuje da su u izvornom 784-dimenzionalnom prostoru točke koje odgovaraju znamenkama također linearno odvojive. U slučaju znamenki 2 i 5, ne možemo pronaći dobru projekciju koja će jasno odvojiti znamenke, zbog čega dolazi do nekih slučajeva pogrešne klasifikacije.\n",
"\n",
"> Kasnije u ovom tečaju naučit ćemo kako stvoriti nelinearne klasifikatore koristeći neuronske mreže i kako se nositi s problemom znamenki koje nisu pravilno poravnate. Vrlo brzo ćemo postići točnost iznad 99% u klasifikaciji znamenki MNIST, dok ih klasificiramo u 10 različitih klasa.\n",
"> Kasnije u ovom tečaju naučit ćemo kako stvoriti nelinearne klasifikatore koristeći neuronske mreže i kako se nositi s problemom neispravnog poravnanja znamenki. Vrlo brzo ćemo postići točnost iznad 99% u klasifikaciji znamenki MNIST, dok ih klasificiramo u 10 različitih klasa.\n",
"\n",
"## Zaključak\n",
"## Zaključci\n",
"\n",
" * Naučili smo o najjednostavnijoj arhitekturi neuronske mreže - perceptronu s jednim slojem.\n",
" * Implementirali smo perceptron \"ručno\", koristeći jednostavan postupak treniranja temeljen na gradijentnom spuštanju.\n",
" * Implementirali smo perceptron \"ručno\", koristeći jednostavnu proceduru treniranja temeljenu na gradijentnom spuštanju.\n",
" * Unatoč jednostavnosti, perceptron s jednim slojem može riješiti prilično složene probleme prepoznavanja rukom pisanih znamenki.\n",
" * Perceptron s jednim slojem je linearni klasifikator, i stoga pruža istu moć klasifikacije kao logistička regresija.\n",
" * U prostoru uzoraka, perceptron može odvojiti dvije klase ulaznih podataka koristeći hiperravninu.\n"
" * U uzorkovnom prostoru, perceptron može odvojiti dvije klase ulaznih podataka koristeći hiperravninu.\n"
]
},
{
@ -1042,14 +1046,14 @@
"source": [
"## Zasluge\n",
"\n",
"Ova bilježnica dio je [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners), a pripremio ju je [Dmitry Soshnikov](http://soshnikov.com). Inspirirana je Radionicom o neuronskim mrežama u Microsoft Research Cambridge. Dio koda i ilustrativnih materijala preuzet je iz prezentacija [Katje Hoffmann](https://www.microsoft.com/en-us/research/people/kahofman/), [Matthewa Johnsona](https://www.microsoft.com/en-us/research/people/matjoh/) i [Ryota Tomioke](https://www.microsoft.com/en-us/research/people/ryoto/), te iz repozitorija [NeuroWorkshop](http://github.com/shwars/NeuroWorkshop).\n"
"Ova bilježnica dio je [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners), a pripremio ju je [Dmitry Soshnikov](http://soshnikov.com). Inspirirana je radionicom o neuronskim mrežama u Microsoft Research Cambridge. Dio koda i ilustrativnih materijala preuzet je iz prezentacija [Katje Hoffmann](https://www.microsoft.com/en-us/research/people/kahofman/), [Matthewa Johnsona](https://www.microsoft.com/en-us/research/people/matjoh/) i [Ryota Tomioke](https://www.microsoft.com/en-us/research/people/ryoto/), kao i iz repozitorija [NeuroWorkshop](http://github.com/shwars/NeuroWorkshop).\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Odricanje od odgovornosti**: \nOvaj dokument je preveden pomoću AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati autoritativnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane čovjeka. Ne preuzimamo odgovornost za bilo kakva pogrešna tumačenja ili nesporazume koji proizlaze iz korištenja ovog prijevoda.\n"
"\n---\n\n**Odricanje od odgovornosti**: \nOvaj dokument je preveden pomoću AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati autoritativnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane čovjeka. Ne preuzimamo odgovornost za nesporazume ili pogrešna tumačenja koja mogu proizaći iz korištenja ovog prijevoda.\n"
]
}
],
@ -1078,8 +1082,8 @@
"start_slideshow_at": "selected"
},
"coopTranslator": {
"original_hash": "914fc55f59efc7e17b8130d4033ac617",
"translation_date": "2025-08-30T07:46:43+00:00",
"original_hash": "d67e5b54ba20b507aa88d71aa3d042d8",
"translation_date": "2025-10-03T13:46:15+00:00",
"source_file": "lessons/3-NeuralNetworks/03-Perceptron/Perceptron.ipynb",
"language_code": "hr"
}

View File

@ -11,9 +11,9 @@
"source": [
"## Perceptron\n",
"\n",
"> Ez a jegyzetfüzet a [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners) része. A teljes tananyagért látogass el a repozitóriumba.\n",
"> Ez a jegyzetfüzet a [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners) része. Látogass el a repozitóriumba a teljes tananyagért.\n",
"\n",
"Ahogy már megbeszéltük, a perceptron lehetővé teszi, hogy megoldjunk egy **bináris osztályozási problémát**, azaz az input példákat két osztályba soroljuk - nevezzük ezeket **pozitív** és **negatív** osztályoknak.\n",
"Ahogy már megbeszéltük, a perceptron lehetővé teszi, hogy megoldjuk a **bináris osztályozási problémát**, azaz az input példákat két osztályba soroljuk - nevezzük őket **pozitív** és **negatív** osztálynak.\n",
"\n",
"Először importáljunk néhány szükséges könyvtárat.\n"
]
@ -49,7 +49,7 @@
"source": [
"## Játékprobléma\n",
"\n",
"Kezdjük egy egyszerű játékproblémával, ahol két bemeneti jellemzőnk van. Például az orvostudományban osztályozhatjuk a daganatokat jóindulatú és rosszindulatú kategóriákba, méretük és koruk alapján.\n",
"Kezdjük egy egyszerű játékproblémával, ahol két bemeneti jellemzőnk van. Például az orvostudományban előfordulhat, hogy daganatokat szeretnénk osztályozni jóindulatú és rosszindulatú kategóriákba, méretük és koruk alapján.\n",
"\n",
"Egy véletlenszerű osztályozási adathalmazt fogunk generálni a SciKit Learn könyvtár `make_classification` függvényének segítségével:\n"
]
@ -95,7 +95,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Rajzoljuk fel az adatokat is:\n"
"Rajzoljuk fel az adathalmazt is:\n"
]
},
{
@ -154,7 +154,7 @@
"source": [
"## Perceptron\n",
"\n",
"Mivel a perceptron egy bináris osztályozó, minden bemeneti vektor $x$ esetén a perceptron kimenete vagy +1, vagy -1 lesz, az osztálytól függően. A kimenetet az alábbi képlet segítségével számítjuk ki:\n",
"Mivel a perceptron egy bináris osztályozó, minden bemeneti vektor $x$ esetében a perceptron kimenete +1 vagy -1 lesz, az osztálytól függően. A kimenetet az alábbi képlettel számítjuk ki:\n",
"\n",
"$$y(\\mathbf{x}) = f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x})$$\n",
"\n",
@ -166,7 +166,7 @@
" \\end{cases} \\\\\n",
"$$\n",
"\n",
"Azonban egy általános lineáris modellnek tartalmaznia kellene egy bias-t is, azaz ideális esetben $y$-t így kellene kiszámítanunk: $y=f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}+\\mathbf{b})$. A modellünk egyszerűsítése érdekében megszabadulhatunk ettől a bias tagtól, ha hozzáadunk egy további dimenziót a bemeneti jellemzőinkhez, amely mindig 1 értékű:\n"
"Azonban egy általános lineáris modellnek elvileg tartalmaznia kellene egy bias-t is, azaz ideális esetben $y$-t így kellene számítani: $y=f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}+\\mathbf{b})$. A modell egyszerűsítése érdekében megszabadulhatunk ettől a bias tagtól, ha hozzáadunk egy új dimenziót a bemeneti jellemzőkhöz, amely mindig 1 értékű:\n"
]
},
{
@ -206,14 +206,14 @@
"source": [
"## Tanítási algoritmus\n",
"\n",
"Ahhoz, hogy a perceptront betanítsuk, meg kell találnunk azokat a súlyokat $\\mathbf{w}$, amelyek minimalizálják a hibát. A hibát a **perceptron kritérium** alapján definiáljuk:\n",
"Ahhoz, hogy a perceptront betanítsuk, meg kell találnunk azokat a súlyokat ($\\mathbf{w}$), amelyek minimalizálják a hibát. A hiba a **perceptron kritérium** alapján van meghatározva:\n",
"\n",
"$$E(\\mathbf{w}) = -\\sum_{n \\in \\mathcal{M}}\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}_{n}t_{n}$$\n",
" \n",
" * $t_{n} \\in \\{-1, +1\\}$ a negatív és pozitív tanítóminták esetén\n",
" * $t_{n} \\in \\{-1, +1\\}$ negatív és pozitív tanító minták esetén\n",
" * $\\mathcal{M}$ - a rosszul osztályozott példák halmaza\n",
" \n",
"A **gradiens módszert** fogjuk használni. Kiindulva egy kezdeti véletlenszerű súlyból $\\mathbf{w}^{(0)}$, minden egyes tanítási lépésben a súlyokat a $E$ gradiensének segítségével fogjuk módosítani:\n",
"A **gradiens csökkentés** módszerét fogjuk használni. Kiindulva egy kezdeti véletlenszerű súlyból ($\\mathbf{w}^{(0)}$), minden lépésben módosítjuk a súlyokat az $E$ gradiensének segítségével:\n",
"\n",
"$$\\mathbf{w}^{\\tau + 1}=\\mathbf{w}^{\\tau} - \\eta \\nabla E(\\mathbf{w}) = \\mathbf{w}^{\\tau} + \\eta\\sum_{n \\in \\mathcal{M}}\\mathbf{x}_{n} t_{n}$$\n",
"\n",
@ -271,7 +271,9 @@
{
"cell_type": "markdown",
"metadata": {},
"source": []
"source": [
"Most futtassuk az edzést az adatállományunkon:\n"
]
},
{
"cell_type": "code",
@ -309,9 +311,9 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Amint látható, a kezdeti pontosság körülbelül 50%, de gyorsan növekszik, és eléri a 90%-hoz közeli értékeket.\n",
"Amint látható, a kezdeti pontosság körülbelül 50%, de gyorsan növekszik, és közel 90%-os értékeket ér el.\n",
"\n",
"Vizualizáljuk, hogyan különülnek el az osztályok. Az osztályozási függvényünk így néz ki: $\\mathbf{w}^Tx$, és az egyik osztály esetében nagyobb, mint 0, míg a másik osztály esetében kisebb, mint 0. Így az osztályokat elválasztó vonalat a $\\mathbf{w}^Tx = 0$ egyenlet határozza meg. Mivel csak két dimenziónk van, $x_0$ és $x_1$, a vonal egyenlete a következő lesz: $w_0x_0+w_1x_1+w_2 = 0$ (ne felejtsük el, hogy kifejezetten definiáltunk egy extra dimenziót, $x_2=1$). Ábrázoljuk ezt a vonalat:\n"
"Vizualizáljuk, hogyan különülnek el az osztályok. A klasszifikációs függvényünk így néz ki: $\\mathbf{w}^Tx$, és az egyik osztály esetében nagyobb, mint 0, míg a másik osztály esetében kisebb, mint 0. Ezért az osztályokat elválasztó vonalat a $\\mathbf{w}^Tx = 0$ határozza meg. Mivel csak két dimenziónk van, $x_0$ és $x_1$, a vonal egyenlete így nézne ki: $w_0x_0+w_1x_1+w_2 = 0$ (ne feledjük, hogy kifejezetten definiáltunk egy extra dimenziót, $x_2=1$). Ábrázoljuk ezt a vonalat:\n"
]
},
{
@ -379,7 +381,7 @@
"source": [
"## Tesztadatok kiértékelése\n",
"\n",
"Kezdetben elkülönítettünk némi adatot a tesztadatokhoz. Nézzük meg, mennyire pontos a klasszifikátorunk ezen a tesztadaton. Ehhez kibővítjük a tesztadatokat egy extra dimenzióval, megszorozzuk a súlymátrixszal, és ellenőrizzük, hogy az így kapott érték ugyanazt az előjelet viseli, mint a címke (+1 vagy -1). Ezután összeadjuk az összes logikai értéket, majd elosztjuk a tesztminta hosszával, hogy megkapjuk a pontosságot:\n"
"Az elején félretettünk néhány adatot a tesztadatokhoz. Nézzük meg, mennyire pontos a klasszifikátorunk ezen a tesztadaton. Ehhez kibővítjük a tesztadatokat egy extra dimenzióval, megszorozzuk a súlymátrixszal, és ellenőrizzük, hogy az így kapott érték ugyanazt az előjelet viseli-e, mint a címke (+1 vagy -1). Ezután összeadjuk az összes logikai értéket, és elosztjuk a tesztminta hosszával, hogy megkapjuk a pontosságot:\n"
]
},
{
@ -418,9 +420,9 @@
}
},
"source": [
"## A tanulási folyamat megfigyelése\n",
"## A képzési folyamat megfigyelése\n",
"\n",
"Korábban láttuk, hogyan csökken a pontosság a tanulás során. Érdekes lenne látni, hogyan változik az elválasztó vonal a tanulás alatt. Az alábbi kód mindent egy grafikonon fog megjeleníteni, és a csúszka segítségével \"időutazást\" tehetsz a tanulási folyamatban.\n"
"Korábban láttuk, hogyan csökken a pontosság a képzés során. Érdekes lenne látni, hogyan változik az elválasztó vonal a képzés alatt. Az alábbi kód mindent egy grafikonon fog megjeleníteni, és a csúszka segítségével \"időutazást\" tehetsz a képzési folyamatban.\n"
]
},
{
@ -529,7 +531,7 @@
"\n",
"Ahogy fentebb láthattad, a perceptron egy **lineáris osztályozó**. Két osztályt jól meg tud különböztetni, ha azok **lineárisan szeparálhatók**, azaz egy egyenes vonallal elválaszthatók. Ellenkező esetben a perceptron tanulási folyamata nem fog konvergálni.\n",
"\n",
"A perceptron által nem megoldható problémák legnyilvánvalóbb példája az úgynevezett **XOR probléma**. Azt szeretnénk, hogy a perceptron megtanulja az XOR logikai függvényt, amelynek az alábbi igazságtáblája van:\n",
"A perceptron által nem megoldható probléma legnyilvánvalóbb példája az úgynevezett **XOR probléma**. Azt szeretnénk, hogy a perceptron megtanulja az XOR logikai függvényt, amelynek az alábbi igazságtáblája van:\n",
"\n",
"| | 0 | 1 |\n",
"|---|---|---|\n",
@ -603,19 +605,19 @@
}
},
"source": [
"Amint a fenti grafikonon látható, a pontosság soha nem haladja meg a 75%-ot, mivel lehetetlen egy olyan egyenes vonalat húzni, amely minden lehetséges példát helyesen osztályozna.\n",
"Amint a fenti grafikonon látható, a pontosság soha nem haladja meg a 75%-ot, mivel lehetetlen olyan egyenes vonalat húzni, amely minden lehetséges példát helyesen osztályozna.\n",
"\n",
"Az XOR probléma a perceptron korlátainak klasszikus példája, amelyre Marvin Minsky és Seymour Papert 1969-ben, a [Perceptrons](https://en.wikipedia.org/wiki/Perceptrons_(book)) című könyvükben hívták fel a figyelmet. Ez a megfigyelés közel 10 évre visszavetette a neurális hálózatok kutatását, annak ellenére, hogy - ahogy a kurzus következő részében látni fogjuk - a többrétegű perceptronok tökéletesen képesek ilyen problémák megoldására.\n",
"Az XOR probléma a perceptron korlátainak klasszikus példája, amelyet Marvin Minsky és Seymour Papert 1969-ben mutatott be [Perceptrons](https://en.wikipedia.org/wiki/Perceptrons_(book)) című könyvükben. Ez a megfigyelés közel 10 évig korlátozta a neurális hálózatok kutatását, annak ellenére, hogy - ahogy a kurzus következő részében látni fogjuk - a többrétegű perceptronok tökéletesen képesek ilyen problémák megoldására.\n",
"\n",
"## Összetettebb példa - MNIST\n",
"## Összetett példa - MNIST\n",
"\n",
"Bár a perceptron nem tudja megoldani az XOR problémát, számos más, összetettebb problémát képes kezelni, például a kézzel írt karakterek felismerését.\n",
"Bár a perceptron nem tudja megoldani az XOR problémát, számos összetettebb problémát képes megoldani, például a kézzel írott karakterek felismerését.\n",
"\n",
"Egy gyakran használt adatbázis a gépi tanulás elsajátításához az [MNIST](https://en.wikipedia.org/wiki/MNIST_database). Ezt a Módosított Nemzeti Szabványügyi és Technológiai Intézet (Modified National Institute of Standards and Technology) hozta létre, és 60000 kézzel írt számjegyből álló tanulóhalmazt tartalmaz, amelyeket körülbelül 250 diák és az intézet alkalmazottai írtak. Emellett van egy 10000 számjegyből álló teszthalmaz is, amelyet különböző személyektől gyűjtöttek.\n",
"Egy gyakran használt adatbázis a gépi tanulás elsajátításakor az [MNIST](https://en.wikipedia.org/wiki/MNIST_database). Ezt a Modified National Institute of Standards and Technology hozta létre, és 60000 kézzel írott számjegyet tartalmazó tanulóhalmazt foglal magában, amelyet körülbelül 250 diák és az intézet alkalmazottai gyűjtöttek össze. Emellett van egy 10000 számjegyet tartalmazó tesztadatbázis, amelyet különböző személyektől gyűjtöttek.\n",
"\n",
"Minden számjegy 28x28 pixeles szürkeárnyalatos képként van ábrázolva.\n",
"\n",
"> Az MNIST adatbázis elérhető egy tanulási versenyként a [Kaggle](https://www.kaggle.com/c/digit-recognizer) oldalán, amely gépi tanulási versenyeknek és pályázatoknak ad otthont. Miután megtanultad az MNIST számjegyek osztályozását, benyújthatod a megoldásodat a Kaggle-re, hogy lásd, hogyan teljesít más résztvevők között.\n",
"> Az MNIST adatbázis elérhető egy tanulási versenyként a [Kaggle](https://www.kaggle.com/c/digit-recognizer) oldalon, amely gépi tanulási versenyeket és pályázatokat szervez. Miután megtanulod az MNIST számjegyek osztályozását, benyújthatod a megoldásodat a Kaggle-re, hogy lásd, hogyan értékelik más résztvevők között. \n",
"\n",
"Kezdjük az MNIST adatbázis betöltésével:\n"
]
@ -642,7 +644,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Most pedig ábrázoljuk az adathalmazt:\n"
"Most már ábrázoljuk az adathalmazt:\n"
]
},
{
@ -693,7 +695,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Mivel a perceptron egy bináris osztályozó, a problémánkat két számjegy felismerésére korlátozzuk. Az alábbi függvény feltölti a pozitív és negatív mintatömböket a megadott két számjeggyel (és a tisztánlátás érdekében meg is jeleníti ezek mintáit).\n"
"Mivel a perceptron egy bináris osztályozó, korlátozni fogjuk a problémát két számjegy felismerésére. Az alábbi függvény pozitív és negatív mintatömböket tölt fel két megadott számjeggyel (és a tisztánlátás érdekében megmutatja ezeknek a számjegyeknek a mintáit is).\n"
]
},
{
@ -733,7 +735,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Először megpróbáljuk osztályozni 0 és 1 között:\n"
"Megpróbáljuk osztályozni 0 és 1 között:\n"
]
},
{
@ -829,11 +831,11 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Kérlek, vedd észre, hogy a pontosság nagyon gyorsan közelít a 100%-hoz.\n",
"Kérjük, vegye figyelembe, hogy a pontosság nagyon gyorsan közel 100%-ra emelkedik.\n",
"\n",
"Kérlek, húzd a csúszkát valahová a tréning vége felé, és figyeld meg a bal oldalon megjelenő súlymátrixot. Ez a mátrix segít megérteni, hogyan működik valójában a perceptron. Láthatod, hogy a mező közepén magas súlyértékek vannak, amelyek azokhoz a pixelekhez tartoznak, amelyek jellemzően az 1-es számjegyhez kapcsolódnak, míg az oldalsó részeken alacsony, negatív értékek találhatók, ahol a 0-s számjegy részei vannak. Tehát, ha a perceptron elé egy 1-es számjegy kerül, annak középső része magas értékekkel szorzódik meg, ami pozitív eredményt ad. Ezzel szemben, amikor a perceptron 0-t lát, a megfelelő pixelek negatív számokkal szorzódnak.\n",
"Kérjük, húzza a csúszkát a tanulási folyamat vége felé, és figyelje meg a bal oldalon ábrázolt súlymátrixot. Ez a mátrix segít megérteni, hogyan működik valójában a perceptron. Láthatja a magas súlyértékeket a mező közepén, amelyek azoknak a pixeleknek felelnek meg, amelyek általában jelen vannak az 1-es számjegynél, és alacsony negatív értékeket az oldalakon, ahol a 0-s számjegy részei találhatók. Tehát, ha a perceptronnak bemutatott számjegy valóban 1, annak középső része magas értékekkel lesz megszorozva, pozitív eredményt produkálva. Ezzel szemben, amikor a perceptron 0-t figyel meg, a megfelelő pixelek negatív számokkal lesznek megszorozva.\n",
"\n",
"> Észreveheted, hogy ha a perceptronnak egy kissé vízszintesen eltolódott 1-es számjegyet adunk, amelynek pixelei olyan helyeket foglalnak el, ahol a 0 függőleges részei vannak, hibás eredményt kaphatunk. Mivel az MNIST adathalmaz természete olyan, hogy minden számjegy középre van igazítva és megfelelően van pozicionálva, a perceptron erre támaszkodik a számjegyek megkülönböztetéséhez.\n",
"> Észreveheti, hogy ha a perceptronnak egy kissé vízszintesen eltolódott 1-es számjegyet adunk, úgy, hogy annak pixelei olyan helyet foglalnak el, ahol a 0 függőleges részei vannak, hibás eredményt kaphatunk. Mivel az MNIST adatbázisunk természete olyan, hogy minden számjegy középre van igazítva és megfelelően van pozicionálva, a perceptron erre támaszkodik a számjegyek megkülönböztetéséhez.\n",
"\n",
"Most próbáljunk ki különböző számjegyeket:\n"
]
@ -911,11 +913,11 @@
"source": [
"## Megbeszélés\n",
"\n",
"Valamilyen oknál fogva a 2-es és az 5-ös nem választható el olyan könnyen egymástól. Annak ellenére, hogy viszonylag magas pontosságot érünk el (85% felett), egyértelműen látható, hogy a perceptron egy ponton megáll a tanulásban.\n",
"Valamilyen oknál fogva a 2-es és az 5-ös szám nem választható el olyan könnyen egymástól. Bár viszonylag magas pontosságot érünk el (85% felett), egyértelműen látható, hogy a perceptron egy ponton megáll a tanulásban.\n",
"\n",
"Hogy megértsük, miért történik ez, megpróbálhatjuk használni a [Főkomponens-analízist](https://en.wikipedia.org/wiki/Principal_component_analysis) (PCA). Ez egy gépi tanulási technika, amelyet az input adathalmaz dimenziójának csökkentésére használnak, oly módon, hogy a legjobb osztályelválasztást érjük el.\n",
"Hogy megértsük, miért történik ez, megpróbálhatjuk alkalmazni a [Főkomponens-elemzést](https://en.wikipedia.org/wiki/Principal_component_analysis) (PCA). Ez egy gépi tanulási technika, amelyet az input adathalmaz dimenzióinak csökkentésére használnak, úgy, hogy a lehető legjobb osztályok közötti elkülöníthetőséget érjük el.\n",
"\n",
"Esetünkben egy bemeneti kép 784 pixelt (bemeneti jellemzőt) tartalmaz, és a PCA segítségével szeretnénk a paraméterek számát mindössze 2-re csökkenteni, hogy ábrázolhassuk őket egy grafikonon. Ez a két paraméter az eredeti jellemzők lineáris kombinációja lenne, és ezt az eljárást úgy tekinthetjük, mint az eredeti 784-dimenziós tér \"elforgatását\", majd annak vetületét figyeljük meg a 2D-s térben, amíg meg nem kapjuk a legjobb nézetet, amely elválasztja az osztályokat.\n"
"Esetünkben egy bemeneti kép 784 pixelt (bemeneti jellemzőt) tartalmaz, és a PCA segítségével szeretnénk a paraméterek számát 2-re csökkenteni, hogy grafikonon ábrázolhassuk őket. Ez a két paraméter az eredeti jellemzők lineáris kombinációja lenne, és ezt az eljárást úgy tekinthetjük, mint az eredeti 784-dimenziós tér \"elforgatását\", majd annak vetületét a 2D-térben figyeljük meg, amíg meg nem kapjuk a legjobb nézetet, amely elválasztja az osztályokat.\n"
]
},
{
@ -1025,17 +1027,17 @@
}
},
"source": [
"Amint látható, a 0 és az 1 egy egyenes vonallal egyértelműen elválasztható. Ez azt jelzi, hogy az eredeti 784-dimenziós térben a számjegyekhez tartozó pontok is lineárisan elválaszthatók. A 2 és az 5 esetében viszont nem található olyan jó vetítés, amely egyértelműen elválasztaná a számjegyeket, ezért előfordulhatnak hibás osztályozási esetek.\n",
"Amint látható, a 0 és az 1 egy egyenes vonallal egyértelműen elválasztható. Ez azt jelzi, hogy az eredeti 784-dimenziós térben a számjegyekhez tartozó pontok is lineárisan elválaszthatók. A 2 és az 5 esetében azonban nem találunk olyan jó vetítést, amely egyértelműen elválasztaná a számjegyeket, így előfordulnak hibás osztályozási esetek.\n",
"\n",
"> A kurzus későbbi részében megtanuljuk, hogyan hozzunk létre nem-lineáris osztályozókat neurális hálózatok segítségével, és hogyan kezeljük azt a problémát, amikor a számjegyek nincsenek megfelelően igazítva. Nagyon hamar elérjük a 99%-os pontosságot az MNIST számjegyosztályozásban, miközben 10 különböző osztályba soroljuk őket.\n",
"> A kurzus későbbi részében megtanuljuk, hogyan hozzunk létre nem-lineáris osztályozókat neurális hálózatok segítségével, és hogyan kezeljük azt a problémát, amikor a számjegyek nincsenek megfelelően elrendezve. Nagyon hamar elérjük a 99%-os pontosságot az MNIST számjegyosztályozásban, miközben 10 különböző osztályba soroljuk őket.\n",
"\n",
"## Összegzés\n",
"\n",
" * Megtanultuk a legegyszerűbb neurális hálózat architektúrát - az egyrétegű perceptront.\n",
" * Kézzel implementáltuk a perceptront, egy egyszerű, gradiens alapú tanítási eljárást használva.\n",
" * Az egyszerűsége ellenére az egyrétegű perceptron képes meglehetősen összetett problémák megoldására, például kézzel írt számjegyek felismerésére.\n",
" * Kézzel implementáltuk a perceptront, egy egyszerű, gradiens csökkenésen alapuló tanítási eljárással.\n",
" * Az egyszerűsége ellenére az egyrétegű perceptron képes meglehetősen összetett problémákat megoldani, például a kézzel írt számjegyek felismerését.\n",
" * Az egyrétegű perceptron egy lineáris osztályozó, így ugyanazt az osztályozási teljesítményt nyújtja, mint a logisztikus regresszió.\n",
" * A mintatérben a perceptron egy hiperplán segítségével képes két bemeneti adat osztályt elválasztani.\n"
" * A mintatérben a perceptron egy hiper sík segítségével képes két bemeneti adat osztályt elválasztani.\n"
]
},
{
@ -1044,14 +1046,14 @@
"source": [
"## Köszönetnyilvánítás\n",
"\n",
"Ez a jegyzetfüzet az [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners) része, és [Dmitry Soshnikov](http://soshnikov.com) készítette. Az anyag a Microsoft Research Cambridge által szervezett Neural Network Workshop ihlette. Néhány kód és szemléltető anyag [Katja Hoffmann](https://www.microsoft.com/en-us/research/people/kahofman/), [Matthew Johnson](https://www.microsoft.com/en-us/research/people/matjoh/) és [Ryoto Tomioka](https://www.microsoft.com/en-us/research/people/ryoto/) prezentációiból származik, valamint a [NeuroWorkshop](http://github.com/shwars/NeuroWorkshop) adattárból.\n"
"Ez a jegyzetfüzet az [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners) része, és [Dmitry Soshnikov](http://soshnikov.com) készítette. Az anyag a Microsoft Research Cambridge Neural Network Workshopjából merít ihletet. Néhány kód és szemléltető anyag [Katja Hoffmann](https://www.microsoft.com/en-us/research/people/kahofman/), [Matthew Johnson](https://www.microsoft.com/en-us/research/people/matjoh/) és [Ryoto Tomioka](https://www.microsoft.com/en-us/research/people/ryoto/) prezentációiból származik, valamint a [NeuroWorkshop](http://github.com/shwars/NeuroWorkshop) repozitóriumból.\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Felelősségkizárás**: \nEzt a dokumentumot az [Co-op Translator](https://github.com/Azure/co-op-translator) AI fordítási szolgáltatás segítségével fordítottuk le. Bár törekszünk a pontosságra, kérjük, vegye figyelembe, hogy az automatikus fordítások hibákat vagy pontatlanságokat tartalmazhatnak. Az eredeti dokumentum az eredeti nyelvén tekintendő hiteles forrásnak. Kritikus információk esetén javasolt a professzionális, emberi fordítás igénybevétele. Nem vállalunk felelősséget a fordítás használatából eredő félreértésekért vagy téves értelmezésekért.\n"
"\n---\n\n**Felelősség kizárása**: \nEz a dokumentum az [Co-op Translator](https://github.com/Azure/co-op-translator) AI fordítási szolgáltatás segítségével került lefordításra. Bár törekszünk a pontosságra, kérjük, vegye figyelembe, hogy az automatikus fordítások hibákat vagy pontatlanságokat tartalmazhatnak. Az eredeti dokumentum az eredeti nyelvén tekintendő hiteles forrásnak. Kritikus információk esetén javasolt professzionális emberi fordítást igénybe venni. Nem vállalunk felelősséget semmilyen félreértésért vagy téves értelmezésért, amely a fordítás használatából eredhet.\n"
]
}
],
@ -1080,8 +1082,8 @@
"start_slideshow_at": "selected"
},
"coopTranslator": {
"original_hash": "914fc55f59efc7e17b8130d4033ac617",
"translation_date": "2025-08-29T15:02:18+00:00",
"original_hash": "d67e5b54ba20b507aa88d71aa3d042d8",
"translation_date": "2025-10-03T13:40:01+00:00",
"source_file": "lessons/3-NeuralNetworks/03-Perceptron/Perceptron.ipynb",
"language_code": "hu"
}

View File

@ -11,7 +11,7 @@
"source": [
"## Perceptron\n",
"\n",
"> Notebook ini adalah bagian dari [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners). Kunjungi repositori untuk mendapatkan materi pembelajaran lengkap.\n",
"> Notebook ini adalah bagian dari [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners). Kunjungi repositori untuk set lengkap materi pembelajaran.\n",
"\n",
"Seperti yang telah kita bahas, perceptron memungkinkan Anda untuk menyelesaikan **masalah klasifikasi biner**, yaitu mengklasifikasikan contoh input ke dalam dua kelas - kita bisa menyebutnya **positif** dan **negatif**.\n",
"\n",
@ -49,7 +49,7 @@
"source": [
"## Masalah Sederhana\n",
"\n",
"Untuk memulai, mari kita mulai dengan masalah sederhana, di mana kita memiliki dua fitur input. Sebagai contoh, dalam dunia medis kita mungkin ingin mengklasifikasikan tumor menjadi jinak dan ganas, tergantung pada ukurannya dan usianya.\n",
"Sebagai permulaan, mari kita mulai dengan masalah sederhana, di mana kita memiliki dua fitur input. Sebagai contoh, dalam dunia medis kita mungkin ingin mengklasifikasikan tumor menjadi jinak dan ganas, tergantung pada ukurannya dan usianya.\n",
"\n",
"Kita akan membuat dataset klasifikasi acak menggunakan fungsi `make_classification` dari pustaka SciKit Learn:\n"
]
@ -271,7 +271,9 @@
{
"cell_type": "markdown",
"metadata": {},
"source": []
"source": [
"Sekarang mari kita jalankan pelatihan pada dataset kita:\n"
]
},
{
"cell_type": "code",
@ -309,9 +311,9 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Seperti yang Anda lihat, akurasi awal sekitar 50%, tetapi dengan cepat meningkat ke nilai yang lebih tinggi mendekati 90%.\n",
"Seperti yang dapat Anda lihat, akurasi awal sekitar 50%, tetapi dengan cepat meningkat ke nilai yang lebih tinggi mendekati 90%.\n",
"\n",
"Mari kita visualisasikan bagaimana kelas-kelas dipisahkan. Fungsi klasifikasi kita terlihat seperti $\\mathbf{w}^Tx$, dan nilainya lebih besar dari 0 untuk satu kelas, serta di bawah 0 untuk kelas lainnya. Dengan demikian, garis pemisah kelas didefinisikan oleh $\\mathbf{w}^Tx = 0$. Karena kita hanya memiliki dua dimensi $x_0$ dan $x_1$, persamaan untuk garis tersebut adalah $w_0x_0+w_1x_1+w_2 = 0$ (ingat bahwa kita secara eksplisit telah mendefinisikan dimensi tambahan $x_2=1$). Mari kita plot garis ini:\n"
"Mari kita visualisasikan bagaimana kelas-kelas dipisahkan. Fungsi klasifikasi kita berbentuk $\\mathbf{w}^Tx$, dan nilainya lebih besar dari 0 untuk satu kelas, serta di bawah 0 untuk kelas lainnya. Dengan demikian, garis pemisah kelas didefinisikan oleh $\\mathbf{w}^Tx = 0$. Karena kita hanya memiliki dua dimensi $x_0$ dan $x_1$, persamaan untuk garis tersebut adalah $w_0x_0+w_1x_1+w_2 = 0$ (ingat bahwa kita telah secara eksplisit mendefinisikan dimensi tambahan $x_2=1$). Mari kita plot garis ini:\n"
]
},
{
@ -379,7 +381,7 @@
"source": [
"## Evaluasi pada Dataset Uji\n",
"\n",
"Di awal, kami telah memisahkan sebagian data untuk dataset uji. Mari kita lihat seberapa akurat classifier kita pada dataset uji ini. Untuk melakukan ini, kita juga memperluas dataset uji dengan menambahkan dimensi ekstra, mengalikan dengan matriks bobot, dan memastikan bahwa nilai yang diperoleh memiliki tanda yang sama dengan label (+1 atau -1). Kemudian, kita menjumlahkan semua nilai boolean dan membaginya dengan panjang sampel uji untuk mendapatkan akurasi:\n"
"Di awal, kita telah memisahkan beberapa data ke dalam dataset uji. Mari kita lihat seberapa akurat classifier kita pada dataset uji ini. Untuk melakukan ini, kita juga memperluas dataset uji dengan dimensi tambahan, mengalikan dengan matriks bobot, dan memastikan bahwa nilai yang diperoleh memiliki tanda yang sama dengan label (+1 atau -1). Kemudian, kita menjumlahkan semua nilai boolean dan membaginya dengan panjang sampel uji, untuk mendapatkan akurasi:\n"
]
},
{
@ -420,7 +422,7 @@
"source": [
"## Mengamati proses pelatihan\n",
"\n",
"Kita telah melihat sebelumnya bagaimana akurasi menurun selama pelatihan. Akan menarik untuk melihat bagaimana garis pemisah berubah selama pelatihan. Kode di bawah ini akan memvisualisasikan semuanya dalam satu grafik, dan Anda dapat menggeser slider untuk \"melihat perjalanan waktu\" melalui proses pelatihan.\n"
"Kita telah melihat sebelumnya bagaimana akurasi menurun selama pelatihan. Akan menarik untuk melihat bagaimana garis pemisah berubah selama pelatihan. Kode di bawah ini akan memvisualisasikan semuanya dalam satu grafik, dan Anda seharusnya dapat menggerakkan slider untuk \"melihat perjalanan waktu\" melalui proses pelatihan.\n"
]
},
{
@ -536,7 +538,7 @@
"| 0 | 0 | 1 | \n",
"| 1 | 1 | 0 |\n",
"\n",
"Mari kita coba lakukan itu! Kita akan secara manual mengisi semua sampel pelatihan positif dan negatif, lalu memanggil fungsi pelatihan kita yang telah didefinisikan di atas:\n"
"Mari kita coba lakukan itu! Kita akan secara manual mengisi semua sampel pelatihan positif dan negatif, lalu memanggil fungsi pelatihan yang telah kita definisikan di atas:\n"
]
},
{
@ -603,19 +605,19 @@
}
},
"source": [
"Seperti yang terlihat dari grafik di atas, akurasi tidak pernah melebihi 75%, karena tidak mungkin menggambar garis lurus sedemikian rupa sehingga semua contoh dapat dipenuhi dengan benar.\n",
"Seperti yang dapat Anda lihat dari grafik di atas, akurasi tidak pernah melebihi 75%, karena tidak mungkin menggambar garis lurus sedemikian rupa sehingga semua contoh dapat diprediksi dengan benar.\n",
"\n",
"Masalah XOR adalah contoh klasik dari keterbatasan perceptron, dan hal ini telah disoroti oleh Marvin Minsky dan Seymour Papert pada tahun 1969 dalam buku mereka [Perceptrons](https://en.wikipedia.org/wiki/Perceptrons_(book)). Pengamatan ini membatasi penelitian di bidang jaringan saraf selama hampir 10 tahun, meskipun - seperti yang akan kita lihat di bagian berikutnya dari kursus ini - perceptron berlapis-lapis mampu menyelesaikan masalah semacam itu dengan baik.\n",
"Masalah XOR adalah contoh klasik dari keterbatasan perceptron, dan hal ini telah disoroti oleh Marvin Minsky dan Seymour Papert pada tahun 1969 dalam buku mereka [Perceptrons](https://en.wikipedia.org/wiki/Perceptrons_(book)). Pengamatan ini membatasi penelitian di bidang jaringan saraf selama hampir 10 tahun, meskipun - seperti yang akan kita lihat di bagian berikutnya dari kursus ini - perceptron berlapis-lapis sebenarnya mampu menyelesaikan masalah semacam itu.\n",
"\n",
"## Contoh Kompleks - MNIST\n",
"\n",
"Meskipun perceptron tidak dapat menyelesaikan masalah XOR, ia dapat menyelesaikan banyak masalah yang lebih kompleks, seperti pengenalan karakter tulisan tangan.\n",
"\n",
"Dataset yang sering digunakan saat mempelajari pembelajaran mesin disebut [MNIST](https://en.wikipedia.org/wiki/MNIST_database). Dataset ini dibuat oleh Modified National Institute of Standards and Technology, dan berisi set pelatihan sebanyak 60.000 digit tulisan tangan, yang dikumpulkan dari sekitar 250 siswa dan karyawan institut tersebut. Terdapat juga dataset pengujian sebanyak 10.000 digit, yang dikumpulkan dari individu yang berbeda.\n",
"Dataset yang sering digunakan saat mempelajari pembelajaran mesin disebut [MNIST](https://en.wikipedia.org/wiki/MNIST_database). Dataset ini dibuat oleh Modified National Institute of Standards and Technology, dan berisi set pelatihan sebanyak 60.000 digit tulisan tangan, yang dikumpulkan dari sekitar 250 siswa dan karyawan institut tersebut. Selain itu, terdapat juga dataset pengujian sebanyak 10.000 digit, yang dikumpulkan dari individu yang berbeda.\n",
"\n",
"Semua digit direpresentasikan dalam bentuk gambar grayscale berukuran 28x28 piksel.\n",
"\n",
"> Dataset MNIST tersedia sebagai kompetisi pelatihan di [Kaggle](https://www.kaggle.com/c/digit-recognizer), sebuah situs yang menyelenggarakan kompetisi dan kontes pembelajaran mesin. Setelah Anda belajar bagaimana mengklasifikasikan digit MNIST, Anda dapat mengirimkan solusi Anda ke Kaggle untuk melihat bagaimana peringkatnya di antara peserta lainnya.\n",
"> Dataset MNIST tersedia sebagai kompetisi pelatihan di [Kaggle](https://www.kaggle.com/c/digit-recognizer), sebuah situs yang menyelenggarakan kompetisi dan kontes pembelajaran mesin. Setelah Anda belajar bagaimana mengklasifikasikan digit MNIST, Anda dapat mengirimkan solusi Anda ke Kaggle untuk melihat bagaimana peringkatnya dibandingkan dengan peserta lainnya.\n",
"\n",
"Kita mulai dengan memuat dataset MNIST:\n"
]
@ -693,7 +695,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Karena perceptron adalah pengklasifikasi biner, kita akan membatasi masalah kita untuk mengenali hanya dua digit. Fungsi di bawah ini akan mengisi array sampel positif dan negatif dengan dua digit yang diberikan (dan juga akan menampilkan sampel dari digit-digit tersebut untuk kejelasan).\n"
"Karena perceptron adalah pengklasifikasi biner, kita akan membatasi masalah kita untuk mengenali hanya dua digit. Fungsi di bawah ini akan mengisi array sampel positif dan negatif dengan dua digit yang diberikan (dan juga akan menunjukkan sampel dari digit tersebut untuk kejelasan).\n"
]
},
{
@ -733,7 +735,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Kami akan mulai dengan mencoba mengklasifikasikan antara 0 dan 1:\n"
"Kita akan mulai dengan mencoba mengklasifikasikan antara 0 dan 1:\n"
]
},
{
@ -829,13 +831,13 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Harap perhatikan bagaimana akurasi meningkat hingga hampir 100% dengan sangat cepat.\n",
"Perhatikan bagaimana akurasi meningkat hingga hampir 100% dengan sangat cepat.\n",
"\n",
"Silakan geser slider ke posisi mendekati akhir pelatihan, dan perhatikan matriks bobot yang diplot di sebelah kiri. Matriks ini akan membantu Anda memahami bagaimana perceptron sebenarnya bekerja. Anda dapat melihat nilai bobot tinggi di tengah bidang, yang sesuai dengan piksel yang biasanya ada untuk angka 1, dan nilai negatif rendah di sisi-sisinya, di mana bagian dari angka 0 berada. Jadi, jika angka yang diberikan kepada perceptron sebenarnya adalah 1, bagian tengahnya akan dikalikan dengan nilai tinggi, menghasilkan hasil positif. Sebaliknya, ketika perceptron mengamati angka 0, piksel yang sesuai akan dikalikan dengan angka negatif.\n",
"Silakan geser slider ke posisi mendekati akhir pelatihan, dan amati matriks bobot yang ditampilkan di sebelah kiri. Matriks ini akan membantu Anda memahami cara kerja perceptron. Anda dapat melihat nilai bobot tinggi di tengah bidang, yang sesuai dengan piksel yang biasanya ada pada digit 1, dan nilai negatif rendah di sisi-sisinya, di mana bagian dari digit 0 berada. Jadi, jika digit yang diberikan kepada perceptron adalah 1, bagian tengahnya akan dikalikan dengan nilai tinggi, menghasilkan hasil positif. Sebaliknya, ketika perceptron mengamati digit 0, piksel yang sesuai akan dikalikan dengan angka negatif.\n",
"\n",
"> Anda mungkin memperhatikan bahwa jika kita memberikan perceptron angka 1 yang sedikit bergeser secara horizontal, sehingga pikselnya menempati tempat di mana terdapat bagian vertikal dari angka 0, kita mungkin mendapatkan hasil yang salah. Karena sifat dataset MNIST kita adalah bahwa semua angka dipusatkan dan diposisikan dengan benar, dan perceptron mengandalkan hal ini untuk membedakan antara angka-angka.\n",
"> Anda mungkin memperhatikan bahwa jika kita memberikan digit 1 kepada perceptron yang sedikit bergeser secara horizontal, sehingga pikselnya berada di tempat di mana terdapat bagian vertikal dari digit 0, kita mungkin mendapatkan hasil yang salah. Karena sifat dataset MNIST kita adalah semua digit terpusat dan diposisikan dengan benar, dan perceptron mengandalkan hal ini untuk membedakan antara digit.\n",
"\n",
"Sekarang mari kita coba angka yang berbeda:\n"
"Sekarang mari kita coba digit yang berbeda:\n"
]
},
{
@ -911,11 +913,11 @@
"source": [
"## Diskusi\n",
"\n",
"Untuk beberapa alasan, 2 dan 5 tidak mudah dipisahkan. Meskipun kita mendapatkan akurasi yang cukup tinggi (di atas 85%), kita dapat dengan jelas melihat bagaimana perceptron berhenti belajar pada titik tertentu.\n",
"Entah mengapa, angka 2 dan 5 tidak mudah dipisahkan. Meskipun kita mendapatkan akurasi yang cukup tinggi (di atas 85%), kita dapat dengan jelas melihat bagaimana perceptron berhenti belajar pada titik tertentu.\n",
"\n",
"Untuk memahami mengapa hal ini terjadi, kita dapat mencoba menggunakan [Principal Component Analysis](https://en.wikipedia.org/wiki/Principal_component_analysis) (PCA). Ini adalah teknik pembelajaran mesin yang digunakan untuk mengurangi dimensi dataset input, dengan cara sedemikian rupa sehingga diperoleh pemisahan terbaik antara kelas-kelas.\n",
"Untuk memahami mengapa hal ini terjadi, kita dapat mencoba menggunakan [Principal Component Analysis](https://en.wikipedia.org/wiki/Principal_component_analysis) (PCA). Ini adalah teknik pembelajaran mesin yang digunakan untuk mengurangi dimensi dataset input, dengan cara mendapatkan pemisahan terbaik antara kelas-kelas.\n",
"\n",
"Dalam kasus kita, sebuah gambar input memiliki 784 piksel (fitur input), dan kita ingin menggunakan PCA untuk mengurangi jumlah parameter menjadi hanya 2, sehingga kita dapat memplotnya pada grafik. Dua parameter tersebut akan menjadi kombinasi linear dari fitur asli, dan kita dapat melihat prosedur ini sebagai \"memutar\" ruang 784 dimensi asli kita dan mengamati proyeksinya ke ruang 2D, hingga kita mendapatkan pandangan terbaik yang memisahkan kelas-kelas tersebut.\n"
"Dalam kasus kita, sebuah gambar input memiliki 784 piksel (fitur input), dan kita ingin menggunakan PCA untuk mengurangi jumlah parameter menjadi hanya 2, sehingga kita dapat memplotnya pada grafik. Kedua parameter tersebut akan menjadi kombinasi linear dari fitur asli, dan kita dapat melihat prosedur ini sebagai \"memutar\" ruang 784 dimensi asli kita dan mengamati proyeksinya ke ruang 2D, hingga kita mendapatkan pandangan terbaik yang memisahkan kelas-kelas.\n"
]
},
{
@ -1025,17 +1027,17 @@
}
},
"source": [
"Seperti yang dapat Anda lihat, angka 0 dan 1 dapat dipisahkan dengan jelas oleh sebuah garis lurus. Ini menunjukkan bahwa dalam ruang berdimensi 784 asli, titik-titik yang mewakili angka-angka tersebut juga dapat dipisahkan secara linear. Namun, dalam kasus angka 2 dan 5, kita tidak dapat menemukan proyeksi yang baik untuk memisahkan angka-angka tersebut dengan jelas, sehingga terdapat beberapa kasus klasifikasi yang salah.\n",
"Seperti yang dapat Anda lihat, angka 0 dan 1 dapat dipisahkan dengan jelas menggunakan garis lurus. Hal ini menunjukkan bahwa dalam ruang 784 dimensi asli, titik-titik yang mewakili digit juga dapat dipisahkan secara linear. Namun, dalam kasus angka 2 dan 5, kita tidak dapat menemukan proyeksi yang baik untuk memisahkan digit dengan jelas, sehingga ada beberapa kasus klasifikasi yang salah.\n",
"\n",
"> Nanti dalam kursus ini, kita akan belajar cara membuat pengklasifikasi non-linear menggunakan Jaringan Syaraf (Neural Networks), dan bagaimana menangani masalah angka-angka yang tidak sejajar dengan baik. Dalam waktu dekat, kita akan mencapai akurasi di atas 99% dalam klasifikasi angka MNIST, sambil mengklasifikasikan mereka ke dalam 10 kelas yang berbeda.\n",
"> Nanti dalam kursus ini kita akan belajar cara membuat pengklasifikasi non-linear menggunakan Neural Networks, dan bagaimana menangani masalah digit yang tidak sejajar dengan baik. Dalam waktu dekat, kita akan mencapai akurasi di atas 99% dalam klasifikasi digit MNIST, sambil mengklasifikasikan mereka ke dalam 10 kelas yang berbeda.\n",
"\n",
"## Poin Penting\n",
"## Kesimpulan\n",
"\n",
" * Kita telah mempelajari arsitektur jaringan syaraf yang paling sederhana - perceptron satu lapis.\n",
" * Kita telah mempelajari arsitektur jaringan neural yang paling sederhana - perceptron satu lapis.\n",
" * Kita telah mengimplementasikan perceptron \"secara manual\", menggunakan prosedur pelatihan sederhana berbasis gradient descent.\n",
" * Meskipun sederhana, perceptron satu lapis dapat menyelesaikan masalah yang cukup kompleks dalam pengenalan angka tulisan tangan.\n",
" * Perceptron satu lapis adalah pengklasifikasi linear, sehingga memiliki kekuatan klasifikasi yang sama seperti regresi logistik.\n",
" * Dalam ruang sampel, perceptron dapat memisahkan dua kelas data masukan menggunakan hyperplane.\n"
" * Meskipun sederhana, perceptron satu lapis dapat menyelesaikan masalah yang cukup kompleks dalam pengenalan digit tulisan tangan.\n",
" * Perceptron satu lapis adalah pengklasifikasi linear, sehingga memberikan kekuatan klasifikasi yang sama seperti regresi logistik.\n",
" * Dalam ruang sampel, perceptron dapat memisahkan dua kelas data input menggunakan hyperplane.\n"
]
},
{
@ -1044,14 +1046,14 @@
"source": [
"## Kredit\n",
"\n",
"Notebook ini adalah bagian dari [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners), dan telah disiapkan oleh [Dmitry Soshnikov](http://soshnikov.com). Notebook ini terinspirasi dari Neural Network Workshop di Microsoft Research Cambridge. Beberapa kode dan materi ilustrasi diambil dari presentasi oleh [Katja Hoffmann](https://www.microsoft.com/en-us/research/people/kahofman/), [Matthew Johnson](https://www.microsoft.com/en-us/research/people/matjoh/), dan [Ryoto Tomioka](https://www.microsoft.com/en-us/research/people/ryoto/), serta dari repositori [NeuroWorkshop](http://github.com/shwars/NeuroWorkshop).\n"
"Notebook ini merupakan bagian dari [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners), dan telah disiapkan oleh [Dmitry Soshnikov](http://soshnikov.com). Notebook ini terinspirasi dari Workshop Neural Network di Microsoft Research Cambridge. Beberapa kode dan materi ilustrasi diambil dari presentasi oleh [Katja Hoffmann](https://www.microsoft.com/en-us/research/people/kahofman/), [Matthew Johnson](https://www.microsoft.com/en-us/research/people/matjoh/), dan [Ryoto Tomioka](https://www.microsoft.com/en-us/research/people/ryoto/), serta dari repositori [NeuroWorkshop](http://github.com/shwars/NeuroWorkshop).\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Penafian**: \nDokumen ini telah diterjemahkan menggunakan layanan penerjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Meskipun kami berupaya untuk memberikan hasil yang akurat, harap diperhatikan bahwa terjemahan otomatis mungkin mengandung kesalahan atau ketidakakuratan. Dokumen asli dalam bahasa aslinya harus dianggap sebagai sumber yang berwenang. Untuk informasi yang bersifat kritis, disarankan menggunakan jasa penerjemahan manusia profesional. Kami tidak bertanggung jawab atas kesalahpahaman atau penafsiran yang keliru yang timbul dari penggunaan terjemahan ini.\n"
"\n---\n\n**Penafian**: \nDokumen ini telah diterjemahkan menggunakan layanan terjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Meskipun kami berupaya untuk memberikan terjemahan yang akurat, harap diperhatikan bahwa terjemahan otomatis mungkin mengandung kesalahan atau ketidakakuratan. Dokumen asli dalam bahasa aslinya harus dianggap sebagai sumber yang berwenang. Untuk informasi yang bersifat kritis, disarankan menggunakan jasa terjemahan manusia profesional. Kami tidak bertanggung jawab atas kesalahpahaman atau interpretasi yang salah yang timbul dari penggunaan terjemahan ini.\n"
]
}
],
@ -1080,8 +1082,8 @@
"start_slideshow_at": "selected"
},
"coopTranslator": {
"original_hash": "914fc55f59efc7e17b8130d4033ac617",
"translation_date": "2025-08-29T14:58:57+00:00",
"original_hash": "d67e5b54ba20b507aa88d71aa3d042d8",
"translation_date": "2025-10-03T13:36:01+00:00",
"source_file": "lessons/3-NeuralNetworks/03-Perceptron/Perceptron.ipynb",
"language_code": "id"
}

View File

@ -11,7 +11,7 @@
"source": [
"## Perceptron\n",
"\n",
"> Questo notebook fa parte del [Curriculum AI per Principianti](http://github.com/microsoft/ai-for-beginners). Visita il repository per l'insieme completo dei materiali didattici.\n",
"> Questo notebook fa parte del [Curriculum AI per Principianti](http://github.com/microsoft/ai-for-beginners). Visita il repository per l'insieme completo dei materiali di apprendimento.\n",
"\n",
"Come abbiamo discusso, il perceptron ti permette di risolvere il **problema di classificazione binaria**, ovvero classificare esempi di input in due classi - possiamo chiamarle **positiva** e **negativa**.\n",
"\n",
@ -152,9 +152,9 @@
}
},
"source": [
"## Perceptrone\n",
"## Perceptron\n",
"\n",
"Poiché il perceptrone è un classificatore binario, per ogni vettore di input $x$ l'output del nostro perceptrone sarà +1 o -1, a seconda della classe. L'output verrà calcolato utilizzando la formula\n",
"Poiché il perceptron è un classificatore binario, per ogni vettore di input $x$ l'output del nostro perceptron sarà +1 o -1, a seconda della classe. L'output verrà calcolato utilizzando la formula\n",
"\n",
"$$y(\\mathbf{x}) = f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x})$$\n",
"\n",
@ -166,7 +166,7 @@
" \\end{cases} \\\\\n",
"$$\n",
"\n",
"Tuttavia, un modello lineare generico dovrebbe anche avere un bias, cioè idealmente dovremmo calcolare $y$ come $y=f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}+\\mathbf{b})$. Per semplificare il nostro modello, possiamo eliminare questo termine di bias aggiungendo una dimensione in più alle nostre caratteristiche di input, che è sempre uguale a 1:\n"
"Tuttavia, un modello lineare generico dovrebbe anche avere un bias, cioè idealmente dovremmo calcolare $y$ come $y=f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}+\\mathbf{b})$. Per semplificare il nostro modello, possiamo eliminare questo termine di bias aggiungendo una dimensione in più alle nostre caratteristiche di input, che sarà sempre uguale a 1:\n"
]
},
{
@ -206,18 +206,18 @@
"source": [
"## Algoritmo di Addestramento\n",
"\n",
"Per addestrare il percettrone, dobbiamo determinare i pesi $\\mathbf{w}$ che minimizzano l'errore. L'errore è definito utilizzando il **criterio del percettrone**:\n",
"Per addestrare il percettrone, dobbiamo determinare i pesi $\\mathbf{w}$ che minimizzeranno l'errore. L'errore è definito utilizzando il **criterio del percettrone**:\n",
"\n",
"$$E(\\mathbf{w}) = -\\sum_{n \\in \\mathcal{M}}\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}_{n}t_{n}$$\n",
" \n",
" * $t_{n} \\in \\{-1, +1\\}$ per campioni di addestramento negativi e positivi, rispettivamente\n",
" * $\\mathcal{M}$ - un insieme di esempi classificati erroneamente\n",
" \n",
"Utilizzeremo il processo di **discesa del gradiente**. Partendo da alcuni pesi iniziali casuali $\\mathbf{w}^{(0)}$, modificheremo i pesi a ogni passo dell'addestramento utilizzando il gradiente di $E$:\n",
"Utilizzeremo il processo di **discesa del gradiente**. Partendo da alcuni pesi iniziali casuali $\\mathbf{w}^{(0)}$, aggiusteremo i pesi a ogni passo dell'addestramento utilizzando il gradiente di $E$:\n",
"\n",
"$$\\mathbf{w}^{\\tau + 1}=\\mathbf{w}^{\\tau} - \\eta \\nabla E(\\mathbf{w}) = \\mathbf{w}^{\\tau} + \\eta\\sum_{n \\in \\mathcal{M}}\\mathbf{x}_{n} t_{n}$$\n",
"\n",
"dove $\\eta$ è un **tasso di apprendimento**, e $\\tau\\in\\mathbb{N}$ - numero di iterazione.\n",
"dove $\\eta$ è il **tasso di apprendimento**, e $\\tau\\in\\mathbb{N}$ - numero di iterazione.\n",
"\n",
"Definiamo questo algoritmo in Python:\n"
]
@ -271,7 +271,9 @@
{
"cell_type": "markdown",
"metadata": {},
"source": []
"source": [
"Ora eseguiamo l'addestramento sul nostro dataset:\n"
]
},
{
"cell_type": "code",
@ -311,7 +313,7 @@
"source": [
"Come puoi vedere, l'accuratezza iniziale è intorno al 50%, ma aumenta rapidamente fino a valori più alti vicini al 90%.\n",
"\n",
"Visualizziamo come le classi sono separate. La nostra funzione di classificazione ha la forma $\\mathbf{w}^Tx$, ed è maggiore di 0 per una classe, e minore di 0 per l'altra. Quindi, la linea di separazione delle classi è definita da $\\mathbf{w}^Tx = 0$. Poiché abbiamo solo due dimensioni $x_0$ e $x_1$, l'equazione della linea sarà $w_0x_0+w_1x_1+w_2 = 0$ (ricorda che abbiamo esplicitamente definito una dimensione extra $x_2=1$). Tracciamo questa linea:\n"
"Visualizziamo come le classi sono separate. La nostra funzione di classificazione ha la forma $\\mathbf{w}^Tx$, ed è maggiore di 0 per una classe, mentre è inferiore a 0 per l'altra. Pertanto, la linea di separazione delle classi è definita da $\\mathbf{w}^Tx = 0$. Poiché abbiamo solo due dimensioni $x_0$ e $x_1$, l'equazione della linea sarebbe $w_0x_0+w_1x_1+w_2 = 0$ (ricorda che abbiamo esplicitamente definito una dimensione extra $x_2=1$). Tracciamo questa linea:\n"
]
},
{
@ -379,7 +381,7 @@
"source": [
"## Valutare sul Dataset di Test\n",
"\n",
"All'inizio, abbiamo messo da parte alcuni dati per il dataset di test. Vediamo quanto è accurato il nostro classificatore su questo dataset di test. Per fare ciò, espandiamo anche il dataset di test con una dimensione aggiuntiva, moltiplichiamo per la matrice dei pesi e ci assicuriamo che il valore ottenuto abbia lo stesso segno dell'etichetta (+1 o -1). Sommiamo quindi tutti i valori booleani e dividiamo per la lunghezza del campione di test, per ottenere l'accuratezza:\n"
"All'inizio, abbiamo messo da parte alcuni dati per il dataset di test. Vediamo quanto è accurato il nostro classificatore su questo dataset di test. Per fare ciò, espandiamo il dataset di test con una dimensione extra, lo moltiplichiamo per la matrice dei pesi e ci assicuriamo che il valore ottenuto abbia lo stesso segno dell'etichetta (+1 o -1). Sommiamo quindi tutti i valori booleani e dividiamo per la lunghezza del campione di test, per ottenere l'accuratezza:\n"
]
},
{
@ -527,7 +529,7 @@
"source": [
"## Limitazioni del Perceptron\n",
"\n",
"Come hai visto sopra, il perceptron è un **classificatore lineare**. È in grado di distinguere bene tra due classi se queste sono **linearmente separabili**, cioè se possono essere separate da una linea retta. Altrimenti, il processo di addestramento del perceptron non convergerà.\n",
"Come hai visto sopra, il perceptron è un **classificatore lineare**. Può distinguere bene tra due classi se sono **linearmente separabili**, cioè se possono essere separate da una linea retta. Altrimenti, il processo di addestramento del perceptron non convergerà.\n",
"\n",
"Un esempio evidente di un problema che non può essere risolto da un perceptron è il cosiddetto **problema XOR**. Vogliamo che il nostro perceptron apprenda la funzione booleana XOR, che ha la seguente tabella di verità:\n",
"\n",
@ -536,7 +538,7 @@
"| 0 | 0 | 1 | \n",
"| 1 | 1 | 0 |\n",
"\n",
"Proviamoci! Popoleremo manualmente tutti i campioni di addestramento positivi e negativi, e poi chiameremo la nostra funzione di addestramento definita sopra:\n"
"Proviamo a farlo! Popoleremo manualmente tutti i campioni di addestramento positivi e negativi, e poi chiameremo la nostra funzione di addestramento definita sopra:\n"
]
},
{
@ -603,19 +605,19 @@
}
},
"source": [
"Come si può vedere dal grafico sopra, l'accuratezza non supera mai il 75%, perché è impossibile tracciare una linea retta in modo da classificare correttamente tutti gli esempi possibili.\n",
"Come puoi vedere dal grafico sopra, l'accuratezza non supera mai il 75%, perché è impossibile tracciare una linea retta in modo da ottenere corretti tutti gli esempi possibili.\n",
"\n",
"Il problema XOR è un esempio classico delle limitazioni del percettrone, ed è stato evidenziato da Marvin Minsky e Seymour Papert nel 1969 nel loro libro [Perceptrons](https://en.wikipedia.org/wiki/Perceptrons_(book)). Questa osservazione ha limitato la ricerca nell'ambito delle reti neurali per quasi 10 anni, anche se - e lo vedremo nella prossima sezione del nostro corso - i percettroni multistrato sono perfettamente in grado di risolvere problemi di questo tipo.\n",
"Il problema XOR è un esempio classico delle limitazioni del perceptron, ed è stato evidenziato da Marvin Minsky e Seymour Papert nel 1969 nel loro libro [Perceptrons](https://en.wikipedia.org/wiki/Perceptrons_(book)). Questa osservazione ha limitato la ricerca nell'ambito delle reti neurali per quasi 10 anni, anche se - e lo vedremo nella prossima sezione del nostro corso - i perceptron multi-strato sono perfettamente in grado di risolvere problemi di questo tipo.\n",
"\n",
"## Esempio Complesso - MNIST\n",
"\n",
"Anche se il percettrone non può risolvere il problema XOR, è in grado di affrontare problemi molto più complessi, come il riconoscimento di caratteri scritti a mano.\n",
"Anche se il perceptron non può risolvere il problema XOR, è in grado di affrontare problemi molto più complessi, come il riconoscimento di caratteri scritti a mano.\n",
"\n",
"Un dataset spesso utilizzato per apprendere il machine learning si chiama [MNIST](https://en.wikipedia.org/wiki/MNIST_database). È stato creato dal Modified National Institute of Standards and Technology e contiene un set di addestramento di 60.000 cifre scritte a mano, raccolte da circa 250 studenti e dipendenti dell'istituto. Esiste anche un set di test composto da 10.000 cifre, raccolte da individui diversi.\n",
"Un dataset spesso utilizzato per apprendere il machine learning si chiama [MNIST](https://en.wikipedia.org/wiki/MNIST_database). È stato creato dal Modified National Institute of Standards and Technology e contiene un set di addestramento di 60.000 cifre scritte a mano, raccolte da circa 250 studenti e dipendenti dell'istituto. C'è anche un dataset di test composto da 10.000 cifre, raccolte da individui diversi.\n",
"\n",
"Tutte le cifre sono rappresentate da immagini in scala di grigi di dimensioni 28x28 pixel.\n",
"\n",
"> Il dataset MNIST è disponibile come competizione di addestramento su [Kaggle](https://www.kaggle.com/c/digit-recognizer), un sito che ospita competizioni e contest di machine learning. Una volta che impari a classificare le cifre MNIST, puoi inviare la tua soluzione a Kaggle per vedere come viene valutata rispetto agli altri partecipanti.\n",
"> Il dataset MNIST è disponibile come competizione di addestramento su [Kaggle](https://www.kaggle.com/c/digit-recognizer), un sito che ospita competizioni e contest di machine learning. Una volta che impari a classificare le cifre MNIST, puoi inviare la tua soluzione su Kaggle per vedere come viene valutata rispetto agli altri partecipanti.\n",
"\n",
"Iniziamo caricando il dataset MNIST:\n"
]
@ -693,7 +695,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Poiché il percettrone è un classificatore binario, limiteremo il nostro problema al riconoscimento di soli due numeri. La funzione seguente popolerà gli array di campioni positivi e negativi con due numeri dati (e mostrerà anche campioni di quei numeri per chiarezza).\n"
"Poiché il percettrone è un classificatore binario, limiteremo il nostro problema al riconoscimento di soli due numeri. La funzione seguente popolerà gli array di campioni positivi e negativi con due cifre date (e mostrerà anche campioni di quelle cifre per chiarezza).\n"
]
},
{
@ -732,7 +734,9 @@
{
"cell_type": "markdown",
"metadata": {},
"source": []
"source": [
"Inizieremo cercando di classificare tra 0 e 1:\n"
]
},
{
"cell_type": "code",
@ -827,11 +831,11 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Si noti come l'accuratezza aumenta quasi al 100% molto rapidamente.\n",
"Si noti come l'accuratezza raggiunga quasi il 100% molto rapidamente.\n",
"\n",
"Per favore, sposta il cursore verso una posizione verso la fine dell'addestramento e osserva la matrice dei pesi tracciata a sinistra. Questa matrice ti permetterà di capire come funziona effettivamente il percettrone. Puoi vedere i valori di peso elevati al centro del campo, che corrispondono ai pixel tipicamente presenti per la cifra 1, e valori negativi bassi ai lati, dove si trovano le parti della cifra 0. Quindi, se la cifra presentata al percettrone è effettivamente un 1, la parte centrale verrà moltiplicata per valori elevati, producendo un risultato positivo. Al contrario, quando il percettrone osserva uno 0, i pixel corrispondenti verranno moltiplicati per numeri negativi.\n",
"Per favore, sposta il cursore verso una posizione alla fine dell'addestramento e osserva la matrice dei pesi rappresentata a sinistra. Questa matrice ti permetterà di capire come funziona effettivamente il percettrone. Puoi vedere i valori di peso elevati al centro del campo, che corrispondono ai pixel tipicamente presenti per la cifra 1, e valori negativi bassi ai lati, dove si trovano le parti della cifra 0. Quindi, se la cifra presentata al percettrone è effettivamente 1, la parte centrale verrà moltiplicata per valori elevati, producendo un risultato positivo. Al contrario, quando il percettrone osserva la cifra 0, i pixel corrispondenti verranno moltiplicati per numeri negativi.\n",
"\n",
"> Potresti notare che, se diamo al nostro percettrone una cifra 1 leggermente spostata orizzontalmente, in modo che i suoi pixel occupino il posto dove ci sono le parti verticali dello 0, potremmo ottenere un risultato errato. Questo perché la natura del nostro dataset MNIST è tale che tutte le cifre sono centrate e posizionate correttamente, e il percettrone si basa su questo per distinguere tra le cifre.\n",
"> Potresti notare che se diamo al nostro percettrone una cifra 1 leggermente spostata orizzontalmente, in modo che i suoi pixel occupino il posto dove ci sono le parti verticali della cifra 0, potremmo ottenere un risultato errato. Poiché la natura del nostro dataset MNIST è tale che tutte le cifre sono centrate e posizionate correttamente, il percettrone si basa su questo per distinguere tra le cifre.\n",
"\n",
"Ora proviamo con cifre diverse:\n"
]
@ -909,11 +913,11 @@
"source": [
"## Discussione\n",
"\n",
"Per qualche motivo, 2 e 5 non sono così facilmente separabili. Anche se otteniamo una precisione relativamente alta (superiore all'85%), possiamo chiaramente vedere come il perceptron smetta di apprendere a un certo punto.\n",
"Per qualche motivo, 2 e 5 non sono così facilmente separabili. Anche se otteniamo un'accuratezza relativamente alta (superiore all'85%), possiamo chiaramente vedere come il perceptron smetta di apprendere a un certo punto.\n",
"\n",
"Per capire perché accade, possiamo provare a utilizzare [Principal Component Analysis](https://en.wikipedia.org/wiki/Principal_component_analysis) (PCA). Si tratta di una tecnica di machine learning utilizzata per ridurre la dimensionalità del dataset di input, in modo da ottenere la migliore separabilità tra le classi.\n",
"Per capire perché accade, possiamo provare a utilizzare [l'Analisi delle Componenti Principali](https://en.wikipedia.org/wiki/Principal_component_analysis) (PCA). Si tratta di una tecnica di machine learning utilizzata per ridurre la dimensionalità del dataset di input, in modo da ottenere la migliore separabilità tra le classi.\n",
"\n",
"Nel nostro caso, un'immagine di input ha 784 pixel (caratteristiche di input), e vogliamo utilizzare PCA per ridurre il numero di parametri a soli 2, così da poterli rappresentare su un grafico. Questi due parametri sarebbero una combinazione lineare delle caratteristiche originali, e possiamo considerare questa procedura come una \"rotazione\" del nostro spazio originale a 784 dimensioni, osservandone la proiezione nello spazio 2D, fino a ottenere la vista migliore che separa le classi.\n"
"Nel nostro caso, un'immagine di input ha 784 pixel (caratteristiche di input), e vogliamo utilizzare la PCA per ridurre il numero di parametri a soli 2, così da poterli rappresentare su un grafico. Questi due parametri sarebbero una combinazione lineare delle caratteristiche originali, e possiamo considerare questa procedura come una \"rotazione\" del nostro spazio originale a 784 dimensioni, osservandone la proiezione nello spazio 2D, fino a ottenere la vista migliore che separa le classi.\n"
]
},
{
@ -1029,11 +1033,11 @@
"\n",
"## Conclusioni\n",
"\n",
" * Abbiamo imparato l'architettura più semplice di rete neurale: il percettrone a uno strato.\n",
" * Abbiamo imparato l'architettura più semplice di rete neurale: il percettrone a un livello.\n",
" * Abbiamo implementato il percettrone \"a mano\", utilizzando una procedura di addestramento semplice basata sulla discesa del gradiente.\n",
" * Nonostante la semplicità, il percettrone a uno strato può risolvere problemi piuttosto complessi di riconoscimento di cifre scritte a mano.\n",
" * Il percettrone a uno strato è un classificatore lineare e, di conseguenza, offre la stessa capacità di classificazione della regressione logistica.\n",
" * Nel campione di spazio, il percettrone può separare due classi di dati di input utilizzando un iperpiano.\n"
" * Nonostante la semplicità, il percettrone a un livello può risolvere problemi piuttosto complessi di riconoscimento di cifre scritte a mano.\n",
" * Il percettrone a un livello è un classificatore lineare e, quindi, offre la stessa capacità di classificazione della regressione logistica.\n",
" * Nello spazio campione, il percettrone può separare due classi di dati di input utilizzando un iperpiano.\n"
]
},
{
@ -1042,14 +1046,14 @@
"source": [
"## Crediti\n",
"\n",
"Questo notebook fa parte del [Curriculum AI per Principianti](http://github.com/microsoft/ai-for-beginners) ed è stato preparato da [Dmitry Soshnikov](http://soshnikov.com). È ispirato al Neural Network Workshop presso Microsoft Research Cambridge. Alcuni codici e materiali illustrativi sono stati presi da presentazioni di [Katja Hoffmann](https://www.microsoft.com/en-us/research/people/kahofman/), [Matthew Johnson](https://www.microsoft.com/en-us/research/people/matjoh/) e [Ryoto Tomioka](https://www.microsoft.com/en-us/research/people/ryoto/), e dal repository [NeuroWorkshop](http://github.com/shwars/NeuroWorkshop).\n"
"Questo notebook fa parte del [Curriculum AI for Beginners](http://github.com/microsoft/ai-for-beginners) ed è stato preparato da [Dmitry Soshnikov](http://soshnikov.com). È ispirato al Workshop sulle Reti Neurali presso Microsoft Research Cambridge. Alcuni codici e materiali illustrativi sono stati presi dalle presentazioni di [Katja Hoffmann](https://www.microsoft.com/en-us/research/people/kahofman/), [Matthew Johnson](https://www.microsoft.com/en-us/research/people/matjoh/) e [Ryoto Tomioka](https://www.microsoft.com/en-us/research/people/ryoto/), e dal repository [NeuroWorkshop](http://github.com/shwars/NeuroWorkshop).\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Disclaimer**: \nQuesto documento è stato tradotto utilizzando il servizio di traduzione automatica [Co-op Translator](https://github.com/Azure/co-op-translator). Sebbene ci impegniamo per garantire l'accuratezza, si prega di notare che le traduzioni automatiche potrebbero contenere errori o imprecisioni. Il documento originale nella sua lingua nativa dovrebbe essere considerato la fonte autorevole. Per informazioni critiche, si consiglia una traduzione professionale eseguita da un traduttore umano. Non siamo responsabili per eventuali fraintendimenti o interpretazioni errate derivanti dall'uso di questa traduzione.\n"
"\n---\n\n**Clausola di esclusione della responsabilità**: \nQuesto documento è stato tradotto utilizzando il servizio di traduzione automatica [Co-op Translator](https://github.com/Azure/co-op-translator). Sebbene ci impegniamo per garantire l'accuratezza, si prega di notare che le traduzioni automatiche potrebbero contenere errori o imprecisioni. Il documento originale nella sua lingua nativa deve essere considerato la fonte autorevole. Per informazioni critiche, si consiglia una traduzione professionale eseguita da un traduttore umano. Non siamo responsabili per eventuali incomprensioni o interpretazioni errate derivanti dall'uso di questa traduzione.\n"
]
}
],
@ -1078,8 +1082,8 @@
"start_slideshow_at": "selected"
},
"coopTranslator": {
"original_hash": "914fc55f59efc7e17b8130d4033ac617",
"translation_date": "2025-08-29T08:21:49+00:00",
"original_hash": "d67e5b54ba20b507aa88d71aa3d042d8",
"translation_date": "2025-10-03T13:24:13+00:00",
"source_file": "lessons/3-NeuralNetworks/03-Perceptron/Perceptron.ipynb",
"language_code": "it"
}

View File

@ -11,9 +11,9 @@
"source": [
"## パーセプトロン\n",
"\n",
"> このノートブックは [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners) の一部です。完全な学習資料セットについてはリポジトリを訪問してください。\n",
"> このノートブックは [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners) の一部です。完全な学習資料セットについてはリポジトリをご覧ください。\n",
"\n",
"前述の通り、パーセプトロンは**二値分類問題**を解決するためのものです。つまり、入力例を2つのクラスに分類することができます - これらを**ポジティブ**と**ネガティブ**と呼びます。\n",
"前述の通り、パーセプトロンは**二値分類問題**を解くことができます。つまり、入力例を2つのクラスに分類することができます - これらを**ポジティブ**と**ネガティブ**と呼びます。\n",
"\n",
"まず、必要なライブラリをインポートしましょう。\n"
]
@ -49,9 +49,9 @@
"source": [
"## おもちゃの問題\n",
"\n",
"まずはおもちゃの問題から始めましょう。ここでは、2つの入力特徴を持つケースを考えます。例えば、医学の分野では、腫瘍をその大きさや年齢に応じて良性か悪性かに分類したい場合があります。\n",
"まずはおもちゃの問題から始めましょう。ここでは、2つの入力特徴を持つケースを考えます。例えば、医学では腫瘍をそのサイズと年齢に基づいて良性か悪性かを分類したい場合があります。\n",
"\n",
"SciKit Learnライブラリの`make_classification`関数を使ってランダムな分類データセットを生成します:\n"
"SciKit Learnライブラリの`make_classification`関数を使ってランダムな分類データセットを生成します:\n"
]
},
{
@ -154,7 +154,7 @@
"source": [
"## パーセプトロン\n",
"\n",
"パーセプトロンは二値分類器であるため、各入力ベクトル $x$ に対して、パーセプトロンの出力はクラスに応じて +1 または -1 のいずれかになります。出力は次の式を用いて計算されます。\n",
"パーセプトロンは二値分類器であるため、各入力ベクトル $x$ に対して、パーセプトロンの出力はクラスに応じて +1 または -1 になります。出力は以下の式で計算されます。\n",
"\n",
"$$y(\\mathbf{x}) = f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x})$$\n",
"\n",
@ -166,7 +166,7 @@
" \\end{cases} \\\\\n",
"$$\n",
"\n",
"ただし、一般的な線形モデルにはバイアスも含まれるべきです。つまり、理想的には $y$ を $y=f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}+\\mathbf{b})$ として計算する必要があります。しかし、モデルを簡略化するために、入力特徴量に常に1となる次元を1つ追加することで、このバイアス項を取り除くことができます。\n"
"しかし、一般的な線形モデルにはバイアスも含まれるべきです。つまり、理想的には $y$ を $y=f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}+\\mathbf{b})$ として計算するべきです。モデルを簡略化するために、入力特徴に常に1である次元を1つ追加することで、このバイアス項を取り除くことができます。\n"
]
},
{
@ -206,7 +206,7 @@
"source": [
"## トレーニングアルゴリズム\n",
"\n",
"パーセプトロンをトレーニングするためには、誤差を最小化する重み $\\mathbf{w}$ を見つける必要があります。誤差は**パーセプトロンクライテリア**を使用して定義されます:\n",
"パーセプトロンをトレーニングするためには、誤差を最小化する重み $\\mathbf{w}$ を見つける必要があります。誤差は**パーセプトロン基準**を使用して定義されます:\n",
"\n",
"$$E(\\mathbf{w}) = -\\sum_{n \\in \\mathcal{M}}\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}_{n}t_{n}$$\n",
" \n",
@ -217,7 +217,7 @@
"\n",
"$$\\mathbf{w}^{\\tau + 1}=\\mathbf{w}^{\\tau} - \\eta \\nabla E(\\mathbf{w}) = \\mathbf{w}^{\\tau} + \\eta\\sum_{n \\in \\mathcal{M}}\\mathbf{x}_{n} t_{n}$$\n",
"\n",
"ここで、$\\eta$ は**学習率**、$\\tau\\in\\mathbb{N}$ はイテレーションの回数を表します。\n",
"ここで、$\\eta$ は**学習率**、$\\tau\\in\\mathbb{N}$ はイテレーションの回数す。\n",
"\n",
"このアルゴリズムをPythonで定義してみましょう\n"
]
@ -271,7 +271,9 @@
{
"cell_type": "markdown",
"metadata": {},
"source": []
"source": [
"では、データセットでトレーニングを実行しましょう。\n"
]
},
{
"cell_type": "code",
@ -309,9 +311,9 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"初期の精度は約50%ですが、すぐに90%近くの高い値に上します。\n",
"ご覧の通り、初期の精度は約50%ですが、すぐに90%近くの高い値に上します。\n",
"\n",
"クラスがどのように分離されるかを視覚化してみましょう。分類関数は $\\mathbf{w}^Tx$ の形をしており、あるクラスでは0より大きく、別のクラスでは0未満になります。したがって、クラス分離線は $\\mathbf{w}^Tx = 0$ によって定義されます。次に、次元が2つだけある場合$x_0$ と $x_1$)、線の方程式は $w_0x_0+w_1x_1+w_2 = 0$ となります(追加の次元 $x_2=1$ を明示的に定義したことを思い出してください)。この線をプロットしてみましょう:\n"
"次に、クラスがどのように分離されているかを視覚化してみましょう。我々の分類関数は $\\mathbf{w}^Tx$ の形をしており、あるクラスでは0より大きく、別のクラスでは0未満になります。したがって、クラス分離線は $\\mathbf{w}^Tx = 0$ によって定義されます。ここで、次元が2つ $x_0$ と $x_1$ のみであるため、この線の方程式は $w_0x_0+w_1x_1+w_2 = 0$ となります(追加の次元 $x_2=1$ を明示的に定義したことを思い出してください)。この線をプロットしてみましょう\n"
]
},
{
@ -377,9 +379,9 @@
}
},
"source": [
"## テストデータセットで評価する\n",
"## テストデータセットで評価\n",
"\n",
"最初に、テストデータセット用に一部のデータを分けておきました。このテストデータセットに対して、私たちの分類器がどれだけ正確であるかを確認してみましょう。そのために、テストデータセットに追加の次元を拡張し、重み行列を掛け合わせ、得られた値がラベル(+1 または -1と同じ符号であることを確認します。その後、すべてのブール値を合計し、テストサンプルの長さで割ることで、精度を算出します。\n"
"最初に、一部のデータをテストデータセットとして分けておきました。このテストデータセットで、分類器の精度を確認してみましょう。そのために、テストデータセットに追加の次元を拡張し、重み行列を掛け合わせ、得られた値がラベル(+1 または -1と同じ符号であることを確認します。その後、すべてのブール値を合計し、テストサンプルの長さで割ることで、精度を算出します。\n"
]
},
{
@ -420,7 +422,7 @@
"source": [
"## トレーニングプロセスの観察\n",
"\n",
"以前、トレーニング中に精度が低下する様子を見ました。トレーニング中に分離線がどのように変化するかを確認できると良いですね。以下のコードはすべてを1つのグラフに可視化し、スライダーを動かしてトレーニングプロセスを「タイムトラベル」することができるようになります。\n"
"以前、トレーニング中に精度が低下する様子を見ました。トレーニング中に分離線がどのように変化するかを確認できると良いですね。以下のコードはすべてを1つのグラフに可視化し、スライダーを動かしてトレーニングプロセスを「タイムトラベル」することができるはずです。\n"
]
},
{
@ -603,21 +605,21 @@
}
},
"source": [
"上記のグラフからわかるように、精度は75%を超えることはありません。これは、すべての例を正しく分類できるような直線を引くことが不可能だからです。\n",
"グラフからわかるように、精度は75%を超えることはありません。これは、すべての例を正しく分類るような直線を引くことが不可能だからです。\n",
"\n",
"XOR問題はパーセプトロンの限界を示す古典的な例であり、1969年にマーヴィン・ミンスキーとシーモア・パパートが著書『[Perceptrons](https://en.wikipedia.org/wiki/Perceptrons_(book))』の中で指摘しました。この観察により、ニューラルネットワーク分野の研究は約10年間停滞しました。しかしながら(これはコースの次のセクションで説明しますが)、多層パーセプトロンはこのような問題を完全に解決する能力を持っています。\n",
"XOR問題はパーセプトロンの限界を示す古典的な例であり、1969年にマービン・ミンスキーとセイモア・パパートが著書『[Perceptrons](https://en.wikipedia.org/wiki/Perceptrons_(book))』で指摘しました。この観察により、ニューラルネットワークの研究は約10年間停滞しました。しかし、次のセクションで学ぶように、多層パーセプトロンはこのような問題を完全に解決することができます。\n",
"\n",
"## 複雑な例 - MNIST\n",
"\n",
"パーセプトロンはXOR問題を解くことはできませんが、手書き文字認識のような、より複雑な問題を解くことができます。\n",
"パーセプトロンはXOR問題を解決できないものの、手書き文字認識のようなより複雑な問題を解決することができます。\n",
"\n",
"機械学習を習得する際によく使用されるデータセットに、[MNIST](https://en.wikipedia.org/wiki/MNIST_database)と呼ばれるものがあります。このデータセットは、改良された米国標準技術Modified National Institute of Standards and Technologyによって作成され、60000個の手書き数字からなるトレーニングセットが含まれています。これらの数字は、約250人の学生や職員から収集されました。また、異なる個人から収集された10000個の数字からなるテストデータセットも含まれています。\n",
"機械学習を習得する際によく使用されるデータセットに、[MNIST](https://en.wikipedia.org/wiki/MNIST_database)があります。このデータセットは、改良された米国標準技術研究所Modified National Institute of Standards and Technologyによって作成され、60000個の手書き数字トレーニングセットが含まれています。これらの数字は、研究所の約250人の学生や職員から収集されました。また、異なる個人から収集された10000個の数字を含むテストデータセットもあります。\n",
"\n",
"すべての数字は、28x28ピクセルのグレースケール画像で表されています。\n",
"\n",
"> MNISTデータセットは、機械学習コンペティションやコンテストを開催するサイトである[Kaggle](https://www.kaggle.com/c/digit-recognizer)でトレーニングコンペティションとして利用可能です。MNISTの数字を分類する方法を学んだら、その解法をKaggleに提出し、他の参加者と比較して評価を確認することができます。\n",
"> MNISTデータセットは、機械学習の競技会を開催するサイト[Kaggle](https://www.kaggle.com/c/digit-recognizer)でトレーニングコンペティションとして利用可能です。MNISTの数字を分類する方法を学んだら、Kaggleにソリューションを提出し、他の参加者と比較して評価を確認することができます。\n",
"\n",
"まず、MNISTデータセットを読み込みます\n"
"まず、MNISTデータセットを読み込みます:\n"
]
},
{
@ -642,7 +644,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"では、データセットをプロットしましょう。\n"
"データセットをプロットしましょう。\n"
]
},
{
@ -693,7 +695,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"パーセプトロンは二値分類器であるため、認識する問題を2つの数字に限定します。以下の関数は、指定された2つの数字を使用して正のサンプル配列と負のサンプル配列を生成しますまた、明確にするためにそれらの数字のサンプルを表示します。\n"
"パーセプトロンは二値分類器であるため、問題を認識する対象を2つの数字に限定します。以下の関数は、指定された2つの数字を用いて正のサンプル配列と負のサンプル配列を生成し、それらの数字のサンプルを明確に示します。\n"
]
},
{
@ -829,13 +831,13 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"精度が非常に速くほぼ100%に達する様子に注目してください。\n",
"精度が非常に速くほぼ100%に達することに注目してください。\n",
"\n",
"トレーニングの終盤にスライダーを移動させ、左側にプロットされた重み行列を観察してください。この行列は、パーセプトロンがどのように機能するかを理解する手助けとなります。フィールドの中央部分に高い重み値が見られますが、これは通常数字1に対応するピクセルを示しています。一方、フィールドの両端には低い負の値があり、これは数字0の部分に対応しています。そのため、パーセプトロンに提示された数字が実際に1である場合、中央部分が高い値で乗算され、正の結果が得られます。逆に、パーセプトロンが数字0を観察すると、対応するピクセルが負の数で乗算されます。\n",
"トレーニングの終盤にスライダーを移動し、左側にプロットされた重み行列を観察してください。この行列を見ることで、パーセプトロンがどのように動作するかを理解することができます。フィールドの中央部分には、通常数字の「1」に対応するピクセルがあり、高い重み値が見られます。一方、数字の「0」の部分に対応する側面には低い負の値が見られます。そのため、パーセプトロンに提示された数字が実際に1である場合、中央部分が高い値で乗算され、正の結果が得られます。逆に、パーセプトロンが「0」を観察すると、対応するピクセルが負の値で乗算されます。\n",
"\n",
"> パーセプトロンに数字1を少し横にずらして与えると、そのピクセルが数字0の縦部分に対応する位置を占める場合、誤った結果が得られる可能性があることに気付くかもしれません。MNISTデータセットの性質上、すべての数字は中央に配置され、適切に位置付けられています。パーセプトロンはこれに依存して数字を区別しています。\n",
"> 数字の「1」を横方向に少しずらして与えると、そのピクセルが「0」の垂直部分に対応する位置を占める場合、誤った結果が得られる可能性があることに気付くかもしれません。MNISTデータセットの性質上、すべての数字は中央に配置され、適切に位置付けられており、パーセプトロンはこれに依存して数字を区別しています。\n",
"\n",
"では、別の数字を試してみましょう:\n"
"では、別の数字を試してみましょう\n"
]
},
{
@ -911,11 +913,11 @@
"source": [
"## 議論\n",
"\n",
"なぜか、2と5はそれほど簡単に分離できません。正確性が比較的高い85%以上)にもかかわらず、ある時点でパーセプトロンが学習を停止する様子が明らかに見て取れます。\n",
"なぜか、2と5は簡単に分離できないことがあります。精度が比較的高い85%以上)にもかかわらず、パーセプトロンがある時点で学習を停止してしまう様子が明らかに見て取れます。\n",
"\n",
"この原因を理解するために、[主成分分析](https://en.wikipedia.org/wiki/Principal_component_analysis) (PCA) を試してみることができます。PCAは、入力データセットの次元を削減し、クラス間の分離性を最大化する機械学習手法です。\n",
"これがなぜ起こるのかを理解するために、[主成分分析 (Principal Component Analysis)](https://en.wikipedia.org/wiki/Principal_component_analysis) (PCA) を試してみることができます。PCAは、入力データセットの次元を削減し、クラス間の分離性を最大化する機械学習手法です。\n",
"\n",
"今回の場合、入力画像には784ピクセル入力特徴量があり、PCAを使用してパラメータの数を2つに減らし、それをグラフ上にプロットしたいと考えています。この2つのパラメータは元の特徴量の線形結合であり、この手法を「元の784次元空間を回転させ、その投影を2次元空間で観察する」と捉えることができます。そして、クラスを最もよく分離できるビューが得られるまでこの操作を行います。\n"
"今回の場合、入力画像は784ピクセル入力特徴量を持っていますが、PCAを使ってパラメータの数を2つに減らし、それをグラフ上にプロットしたいと考えています。この2つのパラメータは元の特徴量の線形結合となり、この手法を「元の784次元空間を回転させ、その投影を2次元空間で観察する」と捉えることができます。そして、クラスを最もよく分離できるビューを得るまでこの操作を続けます。\n"
]
},
{
@ -1025,17 +1027,17 @@
}
},
"source": [
"0と1は直線で明確に分離できることがわかります。これは、元の784次元空間において、数字に対応する点が線形分離可能であることを示しています。一方で、2と5の場合は、数字を明確に分離する良い投影を見つけることができず、誤分類が発生する場合があります。\n",
"ご覧の通り、0と1は直線で明確に分離することができます。これは、元の784次元空間でも数字に対応する点が線形分離可能であることを示しています。しかし、2と5の場合は、数字を明確に分離する良い投影を見つけることができず、誤分類が発生するケースがあります。\n",
"\n",
"> このコースの後半では、ニューラルネットワークを使用して非線形分類器を作成する方法や、数字が適切に整列されていない問題への対処方法を学びます。近いうちに、MNISTの数字分類で99%以上の精度を達成し、10種類のクラスに分類できるようになります。\n",
"> このコースの後半では、ニューラルネットワークを使用して非線形分類器を作成する方法や、数字が適切に整列していない問題への対処方法を学びます。近いうちに、MNISTの数字分類で10種類のクラスに分類しながら99%以上の精度を達成することができます。\n",
"\n",
"## まとめ\n",
"\n",
" * 最も基本的なニューラルネットワークのアーキテクチャである1層パーセプトロンについて学びました。\n",
" * 勾配降下法に基づくシンプルなトレーニング手順を使用して、パーセプトロンを「手作業」で実装しました。\n",
" * シンプルでありながら、1層パーセプトロンは手書き数字認識という比較的複雑な問題を解決できます。\n",
" * シンプルでありながら、1層パーセプトロンは手書き数字認識のような比較的複雑な問題を解決することができます。\n",
" * 1層パーセプトロンは線形分類器であり、ロジスティック回帰と同じ分類能力を提供します。\n",
" * サンプル空間では、パーセプトロンはハイパープレーンを使用して入力データの2つのクラスを分離できます。\n"
" * サンプル空間では、パーセプトロンは入力データの2つのクラスをハイパープレーンで分離することができます。\n"
]
},
{
@ -1044,14 +1046,14 @@
"source": [
"## クレジット\n",
"\n",
"このノートブックは[AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners)の一部であり、[Dmitry Soshnikov](http://soshnikov.com)によって準備されました。Microsoft Research Cambridgeでのニューラルネットワークワークショップに触発されています。一部のコードや説明資料は、[Katja Hoffmann](https://www.microsoft.com/en-us/research/people/kahofman/)、[Matthew Johnson](https://www.microsoft.com/en-us/research/people/matjoh/)、[Ryoto Tomioka](https://www.microsoft.com/en-us/research/people/ryoto/)によるプレゼンテーションから、また[NeuroWorkshop](http://github.com/shwars/NeuroWorkshop)リポジトリから引用されています。\n"
"このノートブックは [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners) の一部であり、[Dmitry Soshnikov](http://soshnikov.com) によって作成されました。Microsoft Research Cambridgeで開催されたニューラルネットワークワークショップに触発されています。一部のコードや説明資料は、[Katja Hoffmann](https://www.microsoft.com/en-us/research/people/kahofman/)、[Matthew Johnson](https://www.microsoft.com/en-us/research/people/matjoh/)、[Ryoto Tomioka](https://www.microsoft.com/en-us/research/people/ryoto/) のプレゼンテーションから、また [NeuroWorkshop](http://github.com/shwars/NeuroWorkshop) リポジトリから引用されています。\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**免責事項**: \nこの文書は、AI翻訳サービス [Co-op Translator](https://github.com/Azure/co-op-translator) を使用して翻訳されています。正確性を追求しておりますが、自動翻訳には誤りや不正確な部分が含まれる可能性があることをご承知ください。元の言語で記載された文書が正式な情報源とみなされるべきです。重要な情報については、専門の人間による翻訳を推奨します。この翻訳の使用に起因する誤解や誤解釈について、当方は責任を負いません。\n"
"\n---\n\n**免責事項**: \nこの文書は、AI翻訳サービス [Co-op Translator](https://github.com/Azure/co-op-translator) を使用して翻訳されています。正確性を追求しておりますが、自動翻訳には誤りや不正確な部分が含まれる可能性があります。元の言語で記載された文書を正式な情報源としてお考えください。重要な情報については、専門の人間による翻訳を推奨します。この翻訳の使用に起因する誤解や誤解釈について、当方は一切の責任を負いません。\n"
]
}
],
@ -1080,8 +1082,8 @@
"start_slideshow_at": "selected"
},
"coopTranslator": {
"original_hash": "914fc55f59efc7e17b8130d4033ac617",
"translation_date": "2025-08-30T09:49:33+00:00",
"original_hash": "d67e5b54ba20b507aa88d71aa3d042d8",
"translation_date": "2025-10-03T13:14:54+00:00",
"source_file": "lessons/3-NeuralNetworks/03-Perceptron/Perceptron.ipynb",
"language_code": "ja"
}

View File

@ -13,9 +13,9 @@
"\n",
"> 이 노트북은 [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners)의 일부입니다. 전체 학습 자료는 해당 저장소를 방문하세요.\n",
"\n",
"앞서 논의했듯이, 퍼셉트론은 **이진 분류 문제**를 해결할 수 있도록 해줍니다. 즉, 입력 예제를 두 개의 클래스 - **긍정**과 **부정**으로 분류할 수 있습니다.\n",
"앞서 논의했듯이, 퍼셉트론은 **이진 분류 문제**를 해결할 수 있도록 해줍니다. 즉, 입력 예제를 두 개의 클래스, **긍정**과 **부정**으로 분류할 수 있습니다.\n",
"\n",
"먼저, 필요한 라이브러리를 몇 가지 가져와 봅시다.\n"
"먼저 필요한 라이브러리를 몇 가지 가져와 봅시다.\n"
]
},
{
@ -47,11 +47,11 @@
}
},
"source": [
"## 장난감 문제\n",
"## 간단한 문제\n",
"\n",
"먼저 두 개의 입력 특성을 가진 간단한 문제로 시작해 봅시다. 예를 들어, 의학 분야에서는 종양의 크기와 나이에 따라 양성인지 악성인지 분류하고자 할 수 있습니다.\n",
"먼저 간단한 문제부터 시작해 보겠습니다. 여기서는 두 개의 입력 특성을 가지고 있습니다. 예를 들어, 의학 분야에서는 종양의 크기와 나이에 따라 양성인지 악성인지 분류하고자 할 수 있습니다.\n",
"\n",
"우리는 SciKit Learn 라이브러리의 `make_classification` 함수를 사용하여 랜덤 분류 데이터셋을 생성할 것입니다:\n"
"SciKit Learn 라이브러리의 `make_classification` 함수를 사용하여 랜덤 분류 데이터셋을 생성해 보겠습니다:\n"
]
},
{
@ -95,7 +95,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"데이터셋도 시각화해 봅시다:\n"
"데이터셋도 플롯해 봅시다:\n"
]
},
{
@ -154,7 +154,7 @@
"source": [
"## 퍼셉트론\n",
"\n",
"퍼셉트론은 이진 분류기이기 때문에, 각 입력 벡터 $x$에 대해 퍼셉트론의 출력은 클래스에 따라 +1 또는 -1이 됩니다. 출력은 다음 공식을 사용하여 계산됩니다:\n",
"퍼셉트론은 이진 분류기이므로, 각 입력 벡터 $x$에 대해 퍼셉트론의 출력은 클래스에 따라 +1 또는 -1이 됩니다. 출력은 다음 공식을 사용하여 계산됩니다:\n",
"\n",
"$$y(\\mathbf{x}) = f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x})$$\n",
"\n",
@ -166,7 +166,7 @@
" \\end{cases} \\\\\n",
"$$\n",
"\n",
"하지만, 일반적인 선형 모델은 바이어스도 포함해야 합니다. 즉, 이상적으로는 $y$를 $y=f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}+\\mathbf{b})$로 계산해야 합니다. 우리의 모델을 단순화하기 위해, 항상 1로 설정된 하나의 차원을 입력 특징에 추가하여 이 바이어스 항을 제거할 수 있습니다:\n"
"하지만, 일반적인 선형 모델은 바이어스(bias)도 포함해야 합니다. 즉, 이상적으로는 $y$를 $y=f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}+\\mathbf{b})$로 계산해야 합니다. 모델을 단순화하기 위해, 항상 1로 고정된 하나의 차원을 입력 특징에 추가하여 이 바이어스 항을 제거할 수 있습니다:\n"
]
},
{
@ -213,11 +213,11 @@
" * $t_{n} \\in \\{-1, +1\\}$: 각각 음성 및 양성 학습 샘플에 해당\n",
" * $\\mathcal{M}$ - 잘못 분류된 예제들의 집합\n",
" \n",
"우리는 **경사 하강법**을 사용할 것입니다. 초기의 임의의 가중치 $\\mathbf{w}^{(0)}$에서 시작하여, 학습의 각 단계에서 $E$의 기울기를 사용 가중치를 조정합니다:\n",
"우리는 **경사 하강법**을 사용할 것입니다. 초기의 임의의 가중치 $\\mathbf{w}^{(0)}$에서 시작하여, 학습의 각 단계에서 $E$의 기울기를 사용하여 가중치를 조정합니다:\n",
"\n",
"$$\\mathbf{w}^{\\tau + 1}=\\mathbf{w}^{\\tau} - \\eta \\nabla E(\\mathbf{w}) = \\mathbf{w}^{\\tau} + \\eta\\sum_{n \\in \\mathcal{M}}\\mathbf{x}_{n} t_{n}$$\n",
"\n",
"여기서 $\\eta$는 **학습률**이고, $\\tau\\in\\mathbb{N}$은 반복 횟수를 나타냅니다.\n",
"여기서 $\\eta$는 **학습률**이고, $\\tau\\in\\mathbb{N}$은 반복 횟수니다.\n",
"\n",
"이 알고리즘을 Python으로 정의해 봅시다:\n"
]
@ -271,7 +271,9 @@
{
"cell_type": "markdown",
"metadata": {},
"source": []
"source": [
"이제 우리의 데이터셋에서 훈련을 실행해 봅시다:\n"
]
},
{
"cell_type": "code",
@ -309,9 +311,9 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"초기 정확도는 약 50% 정도이지만, 빠르게 90%에 가까운 높은 값으로 증가하는 것을 볼 수 있습니다.\n",
"보시다시피 초기 정확도는 약 50% 정도이지만, 빠르게 증가하여 90%에 가까운 높은 값에 도달합니다.\n",
"\n",
"이제 클래스가 어떻게 분리되는지 시각화해 봅시다. 우리의 분류 함수는 $\\mathbf{w}^Tx$ 형태를 가지며, 한 클래스에서는 0보다 크고, 다른 클래스에서는 0보다 작습니다. 따라서 클래스 분리 선은 $\\mathbf{w}^Tx = 0$으로 정의됩니다. 우리가 두 개의 차원 $x_0$와 $x_1$만 가지고 있으므로, 선의 방정식은 $w_0x_0+w_1x_1+w_2 = 0$이 됩니다 (추가 차원 $x_2=1$을 명시적으로 정의한 것을 기억하세요). 이제 이 선을 그려봅시다:\n"
"이제 클래스가 어떻게 분리되는지 시각화해 보겠습니다. 우리의 분류 함수는 $\\mathbf{w}^Tx$ 형태이며, 한 클래스에서는 0보다 크고, 다른 클래스에서는 0보다 작습니다. 따라서 클래스 분리선은 $\\mathbf{w}^Tx = 0$으로 정의됩니다. 우리가 두 개의 차원 $x_0$와 $x_1$만 가지고 있으므로, 선의 방정식은 $w_0x_0+w_1x_1+w_2 = 0$이 됩니다 (추가 차원 $x_2=1$을 명시적으로 정의한 것을 기억하세요). 이제 이 선을 그려봅시다:\n"
]
},
{
@ -379,7 +381,7 @@
"source": [
"## 테스트 데이터셋 평가\n",
"\n",
"처음에 일부 데이터를 테스트 데이터셋으로 분리해 두었습니다. 이제 이 테스트 데이터셋에서 우리의 분류기가 얼마나 정확한지 확인해 봅시다. 이를 위해, 테스트 데이터셋에 추가 차원을 확장하고, 가중치 행렬 곱한 뒤, 얻어진 값이 레이블(+1 또는 -1)과 동일한 부호인지 확인합니다. 그런 다음 모든 불리언 값을 합산하고 테스트 샘플의 길이로 나누어 정확도를 계산합니다:\n"
"처음에 일부 데이터를 테스트 데이터셋으로 분리해 두었습니다. 이제 이 테스트 데이터셋에서 우리의 분류기가 얼마나 정확한지 확인해 봅시다. 이를 위해 테스트 데이터셋에 추가 차원을 확장하고, 가중치 행렬 곱한 뒤, 얻어진 값이 레이블(+1 또는 -1)과 동일한 부호인지 확인합니다. 그런 다음 모든 불리언 값을 합산하고 테스트 샘플의 길이로 나누어 정확도를 계산합니다:\n"
]
},
{
@ -420,7 +422,7 @@
"source": [
"## 훈련 과정 관찰하기\n",
"\n",
"이전에 훈련 중 정확도가 감소하는 모습을 본 적이 있습니다. 훈련 중 분리선이 어떻게 변화하는지 확인할 수 있다면 좋을 것입니다. 아래 코드는 모든 것을 하나의 그래프에 시각화하며, 슬라이더를 움직여 훈련 과정을 \"시간 여행\"하듯 살펴볼 수 있습니다.\n"
"이전에 훈련 중 정확도가 어떻게 감소하는지 살펴보았습니다. 훈련 중 분리선이 어떻게 변화하는지 보는 것도 흥미로울 것입니다. 아래 코드는 모든 것을 하나의 그래프에 시각화하며, 슬라이더를 움직여 훈련 과정을 \"시간 여행\"하듯 살펴볼 수 있습니다.\n"
]
},
{
@ -527,7 +529,7 @@
"source": [
"## 퍼셉트론의 한계\n",
"\n",
"위에서 본 것처럼, 퍼셉트론은 **선형 분류기**입니다. 두 클래스가 **선형적으로 분리 가능**할 경우, 즉 직선으로 구분할 수 있을 경우에는 잘 구분할 수 있습니다. 하지만 그렇지 않은 경우에는 퍼셉트론의 학습 과정이 수렴하지 않습니다.\n",
"위에서 본 것처럼 퍼셉트론은 **선형 분류기**입니다. 두 클래스가 **선형적으로 분리 가능**하다면, 즉 직선으로 구분할 수 있다면 퍼셉트론은 이를 잘 구분할 수 있습니다. 하지만 그렇지 않은 경우에는 퍼셉트론의 학습 과정이 수렴하지 않습니다.\n",
"\n",
"퍼셉트론으로 해결할 수 없는 문제의 가장 명확한 예는 **XOR 문제**입니다. 우리는 퍼셉트론이 다음과 같은 진리표를 가진 XOR 부울 함수를 학습하도록 하고 싶습니다:\n",
"\n",
@ -536,7 +538,7 @@
"| 0 | 0 | 1 | \n",
"| 1 | 1 | 0 |\n",
"\n",
"그럼 한번 시도해 봅시다! 모든 긍정 및 부정 학습 샘플을 수동으로 채우고, 위에서 정의한 train 함수를 호출해 보겠습니다:\n"
"이제 이를 시도해 봅시다! 모든 긍정 및 부정 학습 샘플을 수동으로 채우고, 위에서 정의한 train 함수를 호출해 보겠습니다:\n"
]
},
{
@ -603,19 +605,19 @@
}
},
"source": [
"위 그래프에서 볼 수 있듯이, 정확도는 절대 75%를 넘지 않습니다. 이는 모든 가능한 예제를 정확히 맞출 수 있는 직선을 그리는 것이 불가능하기 때문입니다.\n",
"위 그래프에서 볼 수 있듯이, 정확도는 절대 75%를 넘지 않습니다. 이는 모든 예제를 올바르게 분류할 수 있도록 직선을 그리는 것이 불가능하기 때문입니다.\n",
"\n",
"XOR 문제는 퍼셉트론의 한계를 보여주는 고전적인 예로, 1969년 Marvin Minsky와 Seymour Papert가 그들의 책 [Perceptrons](https://en.wikipedia.org/wiki/Perceptrons_(book))에서 지적한 바 있습니다. 이 관찰은 신경망 분야의 연구를 거의 10년 동안 제한했지만, - 그리고 이는 우리 강의의 다음 섹션에서 보게 될 것입니다 - 다층 퍼셉트론은 이러한 문제를 완벽히 해결할 수 있습니다.\n",
"XOR 문제는 퍼셉트론의 한계를 보여주는 고전적인 사례로, 1969년 Marvin Minsky와 Seymour Papert가 저서 [Perceptrons](https://en.wikipedia.org/wiki/Perceptrons_(book))에서 이를 지적했습니다. 이 관찰은 신경망 분야의 연구를 거의 10년 동안 제한했지만, - 이는 우리 강의의 다음 섹션에서 보게 될 것입니다 - 다층 퍼셉트론은 이러한 문제를 완벽히 해결할 수 있습니다.\n",
"\n",
"## 복잡한 예제 - MNIST\n",
"\n",
"퍼셉트론이 XOR 문제를 해결할 수는 없지만, 손글씨 문자 인식과 같은 훨씬 더 복잡한 문제를 해결할 수 있습니다.\n",
"퍼셉트론이 XOR 문제를 해결할 수 없더라도, 손글씨 문자 인식과 같은 훨씬 더 복잡한 문제를 해결할 수 있습니다.\n",
"\n",
"머신러닝을 배우는 과정에서 자주 사용되는 데이터셋 중 하나는 [MNIST](https://en.wikipedia.org/wiki/MNIST_database)라고 불립니다. 이 데이터셋은 미국 국립표준기술연구소(Modified National Institute of Standards and Technology)에 의해 만들어졌으며, 약 250명의 학생과 연구소 직원들로부터 수집된 60,000개의 손글씨 숫자 훈련 세트를 포함하고 있습니다. 또한, 다른 사람들로부터 수집된 10,000개의 숫자로 구성된 테스트 데이터셋도 있습니다.\n",
"머신러닝을 익힐 때 자주 사용되는 데이터셋은 [MNIST](https://en.wikipedia.org/wiki/MNIST_database)라고 불립니다. 이 데이터셋은 미국 표준 기술 연구소(National Institute of Standards and Technology)가 수정하여 만든 것으로, 약 250명의 학생과 연구소 직원들로부터 수집된 60000개의 손글씨 숫자로 구성된 학습 세트를 포함하고 있습니다. 또한, 다른 사람들로부터 수집된 10000개의 숫자로 구성된 테스트 데이터셋도 포함되어 있습니다.\n",
"\n",
"모든 숫자는 28x28 픽셀 크기의 그레이스케일 이미지로 표현됩니다.\n",
"\n",
"> MNIST 데이터셋은 머신러닝 대회와 콘테스트를 주최하는 사이트인 [Kaggle](https://www.kaggle.com/c/digit-recognizer)에서 훈련용 대회로 제공됩니다. MNIST 숫자를 분류하는 방법을 배우고 나면, Kaggle에 솔루션을 제출하여 다른 참가자들과 비교해 평가받을 수 있습니다.\n",
"> MNIST 데이터셋은 머신러닝 대회와 콘테스트를 주최하는 사이트인 [Kaggle](https://www.kaggle.com/c/digit-recognizer)에서 학습용 대회로 제공됩니다. MNIST 숫자를 분류하는 방법을 배우고 나면, Kaggle에 솔루션을 제출하여 다른 참가자들 사이에서 자신의 평가를 확인할 수 있습니다.\n",
"\n",
"우리는 MNIST 데이터셋을 로드하는 것부터 시작합니다:\n"
]
@ -733,7 +735,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"0과 1 사이를 분류하려고 시도하는 것으로 시작하겠습니다:\n"
"우리는 0과 1을 구분하려고 시도하는 것으로 시작할 것입니다:\n"
]
},
{
@ -829,11 +831,11 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"정확도가 매우 빠르게 거의 100%에 도달하는 것을 확인할 수 있습니다.\n",
"정확도가 매우 빠르게 거의 100%에 도달하는 것을 주목하세요.\n",
"\n",
"훈련의 마지막 부분으로 슬라이더를 이동시키고, 왼쪽에 표시된 가중치 행렬을 관찰해 보세요. 이 행렬은 퍼셉트론이 실제로 어떻게 작동하는지 이해하는 데 도움을 줄 것입니다. 필드 중앙에 높은 가중치 값을 볼 수 있는데, 이는 일반적으로 숫자 1에 해당하는 픽셀을 나타냅니다. 반면, 필드 양쪽에는 숫자 0의 일부에 해당하는 낮은 음수 값이 있습니다. 따라서 퍼셉트론에 제시된 숫자가 실제로 1이라면, 중앙 부분이 높은 값으로 곱해져 긍정적인 결과를 생성합니다. 반대로 퍼셉트론이 숫자 0을 관찰할 때는 해당 픽셀이 음수 값으로 곱해집니다.\n",
"슬라이더를 훈련 후반부로 이동시키고 왼쪽에 표시된 가중치 행렬을 관찰해 보세요. 이 행렬은 퍼셉트론이 실제로 어떻게 작동하는지 이해하는 데 도움을 줄 것입니다. 필드 중앙에 높은 가중치 값이 있는 것을 볼 수 있는데, 이는 일반적으로 숫자 1에 해당하는 픽셀을 나타냅니다. 반면, 양쪽에는 숫자 0의 일부에 해당하는 낮은 음수 값이 있습니다. 따라서 퍼셉트론에 제시된 숫자가 실제로 1이라면, 중앙 부분이 높은 값으로 곱해져 긍정적인 결과를 생성합니다. 반대로 퍼셉트론이 숫자 0을 관찰할 때는 해당 픽셀이 음수로 곱해집니다.\n",
"\n",
"> 퍼셉트론에 숫자 1을 약간 수평으로 이동시켜 주면, 픽셀이 숫자 0의 수직 부분에 해당하는 위치를 차지하게 되어 잘못된 결과를 받을 수 있다는 점을 알 수 있습니다. MNIST 데이터셋의 특성상 모든 숫자가 중앙에 위치하고 올바르게 정렬되어 있으며, 퍼셉트론은 이를 기반으로 숫자를 구분합니다.\n",
"> 숫자 1을 약간 수평으로 이동시켜 픽셀이 숫자 0의 수직 부분에 해당하는 위치를 차지하도록 하면, 잘못된 결과를 받을 수 있다는 점을 알 수 있습니다. MNIST 데이터셋의 특성상 모든 숫자가 중앙에 위치하고 적절히 정렬되어 있으며, 퍼셉트론은 이를 기반으로 숫자를 구분합니다.\n",
"\n",
"이제 다른 숫자를 시도해 봅시다:\n"
]
@ -915,7 +917,7 @@
"\n",
"이 현상을 이해하기 위해 [주성분 분석](https://en.wikipedia.org/wiki/Principal_component_analysis) (PCA)을 사용해 볼 수 있습니다. PCA는 입력 데이터셋의 차원을 줄여 클래스 간의 최적의 분리 가능성을 얻는 데 사용되는 머신 러닝 기법입니다.\n",
"\n",
"우리의 경우, 입력 이미지는 784개의 픽셀(입력 특징)을 가지고 있으며, PCA를 사용하여 매개변수 수를 2개로 줄이고 이를 그래프에 표시하려고 합니다. 이 두 매개변수는 원래 특징들의 선형 결합으로 구성되며, 이 과정을 원래의 784차원 공간을 \"회전\"시키고 이를 2차원 공간에 투영하여 클래스 간의 분리가 가장 잘 이는 뷰를 얻는 것으로 볼 수 있습니다.\n"
"우리의 경우, 입력 이미지는 784개의 픽셀(입력 특징)을 가지고 있으며, PCA를 사용하여 매개변수 수를 2개로 줄이고 이를 그래프에 표시하려고 합니다. 이 두 매개변수는 원래 특징들의 선형 결합으로 구성되며, 이 과정을 784차원 공간을 \"회전\"시키고 이를 2차원 공간에 투영하여 클래스 간의 분리가 가장 잘 이루어지는 뷰를 얻는 것으로 볼 수 있습니다.\n"
]
},
{
@ -1025,16 +1027,16 @@
}
},
"source": [
"0과 1은 직선으로 명확히 구분 수 있습니다. 이는 원래의 784차원 공간에서도 숫자에 해당하는 점들이 선형적으로 분리 가능하다는 것을 나타냅니다. 하지만 2와 5의 경우, 숫자를 명확히 분리할 수 있는 적절한 투영을 찾을 수 없으며, 이로 인해 잘못된 분류가 발생하는 경우가 있습니다.\n",
"0과 1은 직선으로 명확히 구분할 수 있는 것을 볼 수 있습니다. 이는 원래의 784차원 공간에서도 숫자에 해당하는 점들이 선형적으로 분리 가능하다는 것을 나타냅니다. 하지만 2와 5의 경우, 숫자를 명확히 분리할 수 있는 적절한 투영을 찾을 수 없으며, 이로 인해 잘못된 분류가 발생하는 경우가 있습니다.\n",
"\n",
"> 이 강의의 후반부에서는 신경망을 사용하여 비선형 분류기를 만드는 방법과 숫자가 제대로 정렬되지 않은 문제를 해결하는 방법을 배울 것입니다. 곧 MNIST 숫자 분류에서 99% 이상의 정확도를 달성하며, 숫자를 10개의 다른 클래스로 분류할 수 있게 될 것입니다.\n",
"\n",
"## 요점 정리\n",
"\n",
" * 가장 간단한 신경망 구조인 단일 계층 퍼셉트론에 대해 배웠습니다.\n",
" * 경사 하강법을 기반으로 한 간단한 학습 절차를 사용하여 퍼셉트론을 \"직접 구현\"해 보았습니다.\n",
" * 경사 하강법을 기반으로 한 간단한 학습 절차를 사용하여 퍼셉트론을 \"직접\" 구현해 보았습니다.\n",
" * 단순함에도 불구하고, 단일 계층 퍼셉트론은 손글씨 숫자 인식과 같은 비교적 복잡한 문제를 해결할 수 있습니다.\n",
" * 단일 계층 퍼셉트론은 선형 분류기이며, 따라서 로지스틱 회귀와 동일한 분류 능력을 제공합니다.\n",
" * 단일 계층 퍼셉트론은 선형 분류기이므로 로지스틱 회귀와 동일한 분류 능력을 제공합니다.\n",
" * 샘플 공간에서 퍼셉트론은 입력 데이터의 두 클래스를 초평면을 사용하여 분리할 수 있습니다.\n"
]
},
@ -1044,14 +1046,14 @@
"source": [
"## 크레딧\n",
"\n",
"이 노트북은 [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners)의 일부로, [Dmitry Soshnikov](http://soshnikov.com)에 의해 준비되었습니다. 이 내용은 Microsoft Research Cambridge의 신경망 워크숍에서 영감을 받았습니다. 일부 코드와 설명 자료는 [Katja Hoffmann](https://www.microsoft.com/en-us/research/people/kahofman/), [Matthew Johnson](https://www.microsoft.com/en-us/research/people/matjoh/) 및 [Ryoto Tomioka](https://www.microsoft.com/en-us/research/people/ryoto/)의 발표 자료에서 가져왔으며, [NeuroWorkshop](http://github.com/shwars/NeuroWorkshop) 저장소에서도 참고되었습니다.\n"
"이 노트북은 [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners)의 일부로, [Dmitry Soshnikov](http://soshnikov.com)에 의해 준비되었습니다. Microsoft Research Cambridge의 신경망 워크숍에서 영감을 받았습니다. 일부 코드와 설명 자료는 [Katja Hoffmann](https://www.microsoft.com/en-us/research/people/kahofman/), [Matthew Johnson](https://www.microsoft.com/en-us/research/people/matjoh/) 및 [Ryoto Tomioka](https://www.microsoft.com/en-us/research/people/ryoto/)의 발표 자료에서 가져왔으며, [NeuroWorkshop](http://github.com/shwars/NeuroWorkshop) 저장소에서도 참고하였습니다.\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**면책 조항**: \n이 문서는 AI 번역 서비스 [Co-op Translator](https://github.com/Azure/co-op-translator)를 사용하여 번역되었습니다. 정확성을 위해 최선을 다하고 있지만, 자동 번역에는 오류나 부정확성이 포함될 수 있습니다. 원본 문서의 원어 버전이 권위 있는 출처로 간주되어야 합니다. 중요한 정보의 경우, 전문적인 인간 번역을 권장합니다. 이 번역 사용으로 인해 발생하는 오해나 잘못된 해석에 대해 책임을 지지 않습니다.\n"
"\n---\n\n**면책 조항**: \n이 문서는 AI 번역 서비스 [Co-op Translator](https://github.com/Azure/co-op-translator)를 사용하여 번역되었습니다. 정확성을 위해 최선을 다하고 있으나, 자동 번역에는 오류나 부정확성이 포함될 수 있습니다. 원본 문서의 원어 버전을 권위 있는 자료로 간주해야 합니다. 중요한 정보의 경우, 전문적인 인간 번역을 권장합니다. 이 번역 사용으로 인해 발생하는 오해나 잘못된 해석에 대해 당사는 책임을 지지 않습니다.\n"
]
}
],
@ -1080,8 +1082,8 @@
"start_slideshow_at": "selected"
},
"coopTranslator": {
"original_hash": "914fc55f59efc7e17b8130d4033ac617",
"translation_date": "2025-08-31T13:22:55+00:00",
"original_hash": "d67e5b54ba20b507aa88d71aa3d042d8",
"translation_date": "2025-10-03T13:15:52+00:00",
"source_file": "lessons/3-NeuralNetworks/03-Perceptron/Perceptron.ipynb",
"language_code": "ko"
}

View File

@ -11,9 +11,9 @@
"source": [
"## Perceptronas\n",
"\n",
"> Šis užrašų knygelė yra dalis [AI pradedantiesiems mokymo programos](http://github.com/microsoft/ai-for-beginners). Apsilankykite saugykloje, kad rastumėte visą mokymosi medžiagą.\n",
"> Šis užrašų knygelė yra dalis [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners). Apsilankykite saugykloje, kad gautumėte visą mokymosi medžiagą.\n",
"\n",
"Kaip jau aptarėme, perceptronas leidžia spręsti **dvejetainės klasifikacijos problemą**, t. y. klasifikuoti įvesties pavyzdžius į dvi klases galime jas vadinti **teigiama** ir **neigiama**.\n",
"Kaip jau aptarėme, perceptronas leidžia spręsti **dvejetainės klasifikacijos problemą**, t. y. klasifikuoti įvesties pavyzdžius į dvi klases - galime jas vadinti **teigiama** ir **neigiama**.\n",
"\n",
"Pirmiausia importuokime keletą reikalingų bibliotekų.\n"
]
@ -47,11 +47,11 @@
}
},
"source": [
"## Žaislinė užduotis\n",
"## Žaislinė problema\n",
"\n",
"Pradėkime nuo paprastos užduoties, kurioje turime du įvesties požymius. Pavyzdžiui, medicinoje galime norėti klasifikuoti auglius į gerybinius ir piktybinius, atsižvelgiant į jų dydį ir amžių.\n",
"Pradėkime nuo žaislinės problemos, kurioje turime du įvesties požymius. Pavyzdžiui, medicinoje galime norėti klasifikuoti auglius į gerybinius ir piktybinius, atsižvelgiant į jų dydį ir amžių.\n",
"\n",
"Mes sukursime atsitiktinį klasifikacijos duomenų rinkinį naudodami `make_classification` funkciją iš SciKit Learn bibliotekos:\n"
"Sukursime atsitiktinį klasifikacijos duomenų rinkinį naudodami `make_classification` funkciją iš SciKit Learn bibliotekos:\n"
]
},
{
@ -158,7 +158,7 @@
"\n",
"$$y(\\mathbf{x}) = f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x})$$\n",
"\n",
"kur $\\mathbf{w}$ yra svorių vektorius, o $f$ yra žingsninė aktyvavimo funkcija:\n",
"kur $\\mathbf{w}$ yra svorių vektorius, o $f$ yra laiptinė aktyvavimo funkcija:\n",
"$$\n",
"f(x) = \\begin{cases}\n",
" +1 & x \\geq 0 \\\\\n",
@ -166,7 +166,7 @@
" \\end{cases} \\\\\n",
"$$\n",
"\n",
"Tačiau bendras linijinis modelis taip pat turėtų turėti poslinkį (bias), t. y. idealiu atveju turėtume apskaičiuoti $y$ kaip $y=f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}+\\mathbf{b})$. Norėdami supaprastinti mūsų modelį, galime atsisakyti šio poslinkio termino, pridėdami dar vieną dimensiją prie mūsų įvesties požymių, kuri visada lygi 1:\n"
"Tačiau bendras linijinis modelis taip pat turėtų turėti poslinkį (bias), t. y. idealiu atveju $y$ turėtume skaičiuoti kaip $y=f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}+\\mathbf{b})$. Norėdami supaprastinti mūsų modelį, galime atsisakyti šio poslinkio termino, pridėdami dar vieną dimensiją prie mūsų įvesties požymių, kuri visada lygi 1:\n"
]
},
{
@ -206,11 +206,11 @@
"source": [
"## Mokymo algoritmas\n",
"\n",
"Norint mokyti perceptroną, reikia rasti svorius $\\mathbf{w}$, kurie sumažintų klaidą. Klaida apibrėžiama naudojant **perceptrono kriterijų**:\n",
"Norint apmokyti perceptroną, reikia rasti svorius $\\mathbf{w}$, kurie sumažintų klaidą. Klaida apibrėžiama naudojant **perceptrono kriterijų**:\n",
"\n",
"$$E(\\mathbf{w}) = -\\sum_{n \\in \\mathcal{M}}\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}_{n}t_{n}$$\n",
" \n",
" * $t_{n} \\in \\{-1, +1\\}$ neigiamoms ir teigiamoms mokymo pavyzdžių klasėms, atitinkamai\n",
" * $t_{n} \\in \\{-1, +1\\}$ neigiamoms ir teigiamoms mokymo pavyzdžių klasėms atitinkamai\n",
" * $\\mathcal{M}$ - neteisingai klasifikuotų pavyzdžių rinkinys\n",
" \n",
"Naudosime **gradientinio nusileidimo** procesą. Pradėdami nuo pradinio atsitiktinio svorio $\\mathbf{w}^{(0)}$, kiekviename mokymo žingsnyje koreguosime svorius naudodami $E$ gradientą:\n",
@ -271,7 +271,9 @@
{
"cell_type": "markdown",
"metadata": {},
"source": []
"source": [
"Dabar paleiskime mokymą su mūsų duomenų rinkiniu:\n"
]
},
{
"cell_type": "code",
@ -309,9 +311,9 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Kaip matote, pradinis tikslumas yra apie 50%, tačiau jis greitai padidėja iki aukštesnių reikšmių, artimų 90%.\n",
"Kaip matote, pradinė tikslumo vertė yra apie 50 %, tačiau ji greitai padidėja iki aukštesnių, beveik 90 %, reikšmių.\n",
"\n",
"Pažvelkime, kaip klasės yra atskirtos. Mūsų klasifikavimo funkcija atrodo kaip $\\mathbf{w}^Tx$, ir ji yra didesnė už 0 vienai klasei, o mažesnė už 0 kitai klasei. Taigi, klasių atskyrimo linija yra apibrėžiama kaip $\\mathbf{w}^Tx = 0$. Kadangi turime tik du matmenis $x_0$ ir $x_1$, tiesės lygtis būtų $w_0x_0+w_1x_1+w_2 = 0$ (prisiminkite, kad mes aiškiai apibrėžėme papildomą matmenį $x_2=1$). Nubraižykime šią liniją:\n"
"Pažvelkime, kaip klasės yra atskirtos. Mūsų klasifikavimo funkcija atrodo kaip $\\mathbf{w}^Tx$, ir ji yra didesnė nei 0 vienai klasei, o mažesnė nei 0 kitai. Taigi, klasių atskyrimo linija apibrėžiama kaip $\\mathbf{w}^Tx = 0$. Kadangi turime tik du matmenis $x_0$ ir $x_1$, linijos lygtis būtų $w_0x_0+w_1x_1+w_2 = 0$ (prisiminkite, kad aiškiai apibrėžėme papildomą matmenį $x_2=1$). Nubraižykime šią liniją:\n"
]
},
{
@ -377,9 +379,9 @@
}
},
"source": [
"## Įvertinimas testavimo duomenų rinkinyje\n",
"## Testavimo duomenų rinkinio vertinimas\n",
"\n",
"Pradžioje atskyrėme dalį duomenų testavimo duomenų rinkiniui. Pažiūrėkime, kaip tiksliai mūsų klasifikatorius veikia su šiuo testavimo duomenų rinkiniu. Tam mes taip pat praplečiame testavimo duomenų rinkinį papildoma dimensija, padauginame iš svorių matricos ir įsitikiname, kad gauta reikšmė turi tą patį ženklą kaip ir etiketė (+1 arba -1). Tada sudedame visas logines reikšmes ir padaliname iš testavimo pavyzdžių ilgio, kad gautume tikslumą:\n"
"Pradžioje mes atskyrėme dalį duomenų testavimo duomenų rinkiniui. Pažiūrėkime, koks tikslus mūsų klasifikatorius yra šiame testavimo duomenų rinkinyje. Tam mes taip pat praplečiame testavimo duomenų rinkinį papildoma dimensija, padauginame iš svorių matricos ir įsitikiname, kad gauta vertė turi tą patį ženklą kaip ir etiketė (+1 arba -1). Tada sudedame visas logines reikšmes ir padaliname iš testavimo pavyzdžių ilgio, kad gautume tikslumą:\n"
]
},
{
@ -418,9 +420,9 @@
}
},
"source": [
"## Stebėjimas mokymosi proceso\n",
"## Stebėjimas mokymo proceso metu\n",
"\n",
"Anksčiau matėme, kaip tikslumas mažėja mokymosi metu. Būtų įdomu pamatyti, kaip mokymosi metu keičiasi atskyrimo linija. Žemiau pateiktas kodas vizualizuos viską viename grafike, ir jūs galėsite perkelti slankiklį, kad „keliautumėte laiku“ per mokymosi procesą.\n"
"Anksčiau matėme, kaip tikslumas mažėja mokymo metu. Būtų įdomu pamatyti, kaip mokymo metu keičiasi atskyrimo linija. Žemiau pateiktas kodas vizualizuos viską viename grafike, ir jūs galėsite perkelti slankiklį, kad „keliautumėte laiku“ per mokymo procesą.\n"
]
},
{
@ -529,14 +531,14 @@
"\n",
"Kaip matėte aukščiau, perceptronas yra **linijinis klasifikatorius**. Jis gali gerai atskirti dvi klases, jei jos yra **linijiškai atskiriamos**, t. y. gali būti atskirtos tiesia linija. Priešingu atveju perceptrono mokymo procesas nesusikonverguos.\n",
"\n",
"Akivaizdžiausias pavyzdys problemos, kurios perceptronas negali išspręsti, yra vadinamoji **XOR problema**. Norime, kad mūsų perceptronas išmoktų XOR loginę funkciją, kuri turi tokią tiesos lentelę:\n",
"Akivaizdžiausias pavyzdys problemos, kurios perceptronas negali išspręsti, yra vadinamoji **XOR problema**. Norime, kad mūsų perceptronas išmoktų XOR loginę funkciją, kurios tiesos lentelė atrodo taip:\n",
"\n",
"| | 0 | 1 |\n",
"|---|---|---|\n",
"| 0 | 0 | 1 | \n",
"| 1 | 1 | 0 |\n",
"\n",
"Pabandykime tai padaryti! Rankiniu būdu užpildysime visus teigiamus ir neigiamus mokymo pavyzdžius, o tada iškviesime mūsų aukščiau apibrėžtą mokymo funkciją:\n"
"Pabandykime tai padaryti! Mes rankiniu būdu užpildysime visus teigiamus ir neigiamus mokymo pavyzdžius, o tada iškviesime mūsų aukščiau apibrėžtą train funkciją:\n"
]
},
{
@ -603,15 +605,15 @@
}
},
"source": [
"Kaip matote iš aukščiau pateikto grafiko, tikslumas niekada neviršija 75%, nes neįmanoma nubrėžti tiesios linijos taip, kad būtų teisingai apdoroti visi galimi pavyzdžiai.\n",
"Kaip matote iš aukščiau pateikto grafiko, tikslumas niekada neviršija 75%, nes neįmanoma nubrėžti tiesės taip, kad būtų teisingai klasifikuoti visi galimi pavyzdžiai.\n",
"\n",
"XOR problema yra klasikinis perceptrono apribojimų pavyzdys, ir ją 1969 metais savo knygoje [Perceptrons](https://en.wikipedia.org/wiki/Perceptrons_(book)) paminėjo Marvin Minsky ir Seymour Papert. Šis pastebėjimas beveik 10 metų apribojo tyrimus neuroninių tinklų srityje, nors - kaip pamatysime kitame mūsų kurso skyriuje - daugiapakopiai perceptronai puikiai sugeba spręsti tokias problemas.\n",
"XOR problema yra klasikinis perceptrono apribojimų pavyzdys, ir ją 1969 m. savo knygoje [Perceptrons](https://en.wikipedia.org/wiki/Perceptrons_(book)) paminėjo Marvin Minsky ir Seymour Papert. Šis pastebėjimas beveik 10 metų apribojo tyrimus neuroninių tinklų srityje, nors - kaip pamatysime kitame mūsų kurso skyriuje - daugiapakopiai perceptronai puikiai sugeba spręsti tokias problemas.\n",
"\n",
"## Sudėtingas pavyzdys - MNIST\n",
"\n",
"Nors perceptronas negali išspręsti XOR problemos, jis gali išspręsti daug sudėtingesnių problemų, pavyzdžiui, ranka rašytų simbolių atpažinimą.\n",
"\n",
"Duomenų rinkinys, kuris dažnai naudojamas mokantis mašininio mokymosi, vadinamas [MNIST](https://en.wikipedia.org/wiki/MNIST_database). Jį sukūrė Modifikuotas Nacionalinis Standartų ir Technologijų Institutas, ir jis apima mokymo rinkinį, sudarytą iš 60000 ranka rašytų skaitmenų, surinktų iš maždaug 250 studentų ir instituto darbuotojų. Taip pat yra testavimo duomenų rinkinys, sudarytas iš 10000 skaitmenų, surinktų iš skirtingų asmenų.\n",
"Dažnai naudojamas duomenų rinkinys, mokantis mašininio mokymosi, vadinamas [MNIST](https://en.wikipedia.org/wiki/MNIST_database). Jį sukūrė Modifikuotas Nacionalinis Standartų ir Technologijų Institutas, ir jis apima mokymo rinkinį, sudarytą iš 60000 ranka rašytų skaitmenų, surinktų iš maždaug 250 instituto studentų ir darbuotojų. Taip pat yra testavimo duomenų rinkinys, sudarytas iš 10000 skaitmenų, surinktų iš skirtingų asmenų.\n",
"\n",
"Visi skaitmenys pateikiami kaip pilkų atspalvių vaizdai, kurių dydis yra 28x28 pikseliai.\n",
"\n",
@ -831,11 +833,11 @@
"source": [
"Atkreipkite dėmesį, kaip tikslumas labai greitai pasiekia beveik 100%.\n",
"\n",
"Prašome perkelti slankiklį į kokią nors poziciją link mokymo pabaigos ir stebėti kairėje pusėje pateiktą svorių matricą. Ši matrica leis jums suprasti, kaip perceptronas iš tikrųjų veikia. Galite matyti aukštas svorių reikšmes lauko viduryje, kurios atitinka pikselius, paprastai esančius skaičiui 1, ir žemas neigiamas reikšmes šonuose, kur yra 0 skaičiaus dalys. Taigi, jei perceptronui pateiktas skaičius iš tiesų yra 1, jo vidurinė dalis bus padauginta iš aukštų reikšmių, sukuriant teigiamą rezultatą. Priešingai, kai perceptronas stebi 0, atitinkami pikseliai bus padauginti iš neigiamų skaičių.\n",
"Prašome perkelti slankiklį į poziciją, esančią arčiau mokymo pabaigos, ir stebėti svorio matricą, pateiktą kairėje. Ši matrica padės jums suprasti, kaip iš tiesų veikia perceptronas. Galite matyti aukštas svorio reikšmes lauko viduryje, kurios atitinka pikselius, paprastai esančius skaitmenyje 1, ir žemas neigiamas reikšmes šonuose, kur yra skaitmens 0 dalys. Taigi, jei perceptronui pateikiamas skaitmuo 1, jo vidurinė dalis bus padauginta iš aukštų reikšmių, gaunant teigiamą rezultatą. Priešingai, kai perceptronas stebi skaitmenį 0, atitinkami pikseliai bus padauginti iš neigiamų skaičių.\n",
"\n",
"> Galite pastebėti, kad jei mūsų perceptronui pateikiame šiek tiek horizontaliai paslinktą skaičių 1, taip, kad jo pikseliai užimtų vietą, kur yra vertikalios 0 dalys, galime gauti neteisingą rezultatą. Kadangi mūsų MNIST duomenų rinkinio prigimtis yra tokia, kad visi skaičiai yra centruoti ir tinkamai išdėstyti, perceptronas remiasi tuo, kad atskirtų skaičius.\n",
"> Galite pastebėti, kad jei perceptronui pateikiame šiek tiek horizontaliai paslinktą skaitmenį 1, kurio pikseliai užima vietą, kur yra vertikalios skaitmens 0 dalys, galime gauti neteisingą rezultatą. Kadangi mūsų MNIST duomenų rinkinio pobūdis yra toks, kad visi skaitmenys yra centruoti ir tinkamai išdėstyti, perceptronas remiasi tuo, kad galėtų atskirti skaitmenis.\n",
"\n",
"Dabar pabandykime kitus skaičius:\n"
"Dabar išbandykime skirtingus skaitmenis:\n"
]
},
{
@ -911,11 +913,11 @@
"source": [
"## Diskusija\n",
"\n",
"Dėl tam tikrų priežasčių, 2 ir 5 nėra taip lengvai atskiriami. Nors pasiekiame gana aukštą tikslumą (virš 85%), aiškiai matome, kaip perceptronas tam tikru momentu nustoja mokytis.\n",
"Dėl tam tikrų priežasčių skaičiai 2 ir 5 nėra taip lengvai atskiriami. Nors pasiekiame gana aukštą tikslumą (virš 85%), aiškiai matome, kaip perceptronas tam tikru momentu nustoja mokytis.\n",
"\n",
"Norėdami suprasti, kodėl taip vyksta, galime pabandyti naudoti [Pagrindinių Komponentų Analizę](https://en.wikipedia.org/wiki/Principal_component_analysis) (PCA). Tai yra mašininio mokymosi technika, naudojama sumažinti įvesties duomenų dimensiją taip, kad būtų pasiekta geriausia klasių atskirtis.\n",
"Norėdami suprasti, kodėl taip nutinka, galime pasitelkti [Pagrindinių komponentų analizę](https://en.wikipedia.org/wiki/Principal_component_analysis) (PCA). Tai mašininio mokymosi technika, naudojama sumažinti įvesties duomenų dimensiją taip, kad būtų pasiekta geriausia klasių atskirtis.\n",
"\n",
"Mūsų atveju įvesties vaizdas turi 784 pikselius (įvesties požymius), o mes norime naudoti PCA, kad sumažintume parametrų skaičių iki 2, kad galėtume juos pavaizduoti grafike. Tie du parametrai būtų originalių požymių linijinė kombinacija, ir šį procesą galime įsivaizduoti kaip mūsų pradinės 784-dimensinės erdvės „sukimą“ ir jos projekcijos stebėjimą 2D erdvėje, kol gausime geriausią klasių atskirties vaizdą.\n"
"Mūsų atveju įvesties vaizdas turi 784 pikselius (įvesties požymius), o mes norime naudoti PCA, kad sumažintume parametrų skaičių iki 2, kad galėtume juos pavaizduoti grafike. Tie du parametrai būtų originalių požymių linijinė kombinacija, ir šį procesą galime įsivaizduoti kaip mūsų pradinės 784 dimensijų erdvės „sukimą“ ir jos projekcijos stebėjimą 2D erdvėje, kol gausime geriausią vaizdą, kuris atskiria klases.\n"
]
},
{
@ -1025,17 +1027,17 @@
}
},
"source": [
"Kaip matote, 0 ir 1 galima aiškiai atskirti tiesia linija. Tai rodo, kad pradiniame 784 matmenų erdvės taškai, atitinkantys skaitmenis, taip pat yra linijiškai atskiriami. Kalbant apie 2 ir 5, negalime rasti tinkamos projekcijos, kuri aiškiai atskirtų šiuos skaitmenis, todėl kai kuriais atvejais įvyksta neteisinga klasifikacija.\n",
"Kaip matote, 0 ir 1 galima aiškiai atskirti tiesia linija. Tai rodo, kad pradiniame 784 matmenų erdvėje taškai, atitinkantys skaitmenis, taip pat yra linijiškai atskiriami. Kalbant apie 2 ir 5, mes negalime rasti tinkamos projekcijos, kuri aiškiai atskirtų skaitmenis, todėl kai kuriais atvejais įvyksta neteisinga klasifikacija.\n",
"\n",
"> Vėliau šiame kurse išmoksime kurti nelinijinius klasifikatorius, naudodami neuroninius tinklus, ir spręsti problemą, kai skaitmenys nėra tinkamai išdėstyti. Labai greitai pasieksime daugiau nei 99% tikslumą MNIST skaitmenų klasifikacijoje, klasifikuodami juos į 10 skirtingų klasių.\n",
"> Vėliau šiame kurse išmoksime kurti nelinijinius klasifikatorius naudojant neuroninius tinklus ir spręsti problemą, kai skaitmenys nėra tinkamai išdėstyti. Labai greitai pasieksime daugiau nei 99% tikslumą MNIST skaitmenų klasifikacijoje, klasifikuodami juos į 10 skirtingų klasių.\n",
"\n",
"## Svarbiausios mintys\n",
"## Pagrindinės mintys\n",
"\n",
" * Išmokome apie paprasčiausią neuroninio tinklo architektūrą vieno sluoksnio perceptroną.\n",
" * Rankiniu būdu įgyvendinome perceptroną, naudodami paprastą mokymo procedūrą, pagrįstą gradientiniu nusileidimu.\n",
" * Nepaisant paprastumo, vieno sluoksnio perceptronas gali spręsti gana sudėtingas ranka rašytų skaitmenų atpažinimo problemas.\n",
" * Vieno sluoksnio perceptronas yra linijinis klasifikatorius, todėl jis turi tokią pačią klasifikavimo galią kaip ir logistinė regresija.\n",
" * Pavyzdžių erdvėje perceptronas gali atskirti dvi įvesties duomenų klases, naudodamas hiperplokštumą.\n"
" * Duomenų erdvėje perceptronas gali atskirti dvi įvesties duomenų klases naudodamas hiperplokštumą.\n"
]
},
{
@ -1044,14 +1046,14 @@
"source": [
"## Kreditas\n",
"\n",
"Šis užrašų knygelė yra dalis [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners) ir buvo parengta [Dmitry Soshnikov](http://soshnikov.com). Ji įkvėpta Neuroninių Tinklų Dirbtuvių, vykusių Microsoft Research Cambridge. Kai kurie kodai ir iliustracinė medžiaga yra paimti iš pristatymų, kuriuos parengė [Katja Hoffmann](https://www.microsoft.com/en-us/research/people/kahofman/), [Matthew Johnson](https://www.microsoft.com/en-us/research/people/matjoh/) ir [Ryoto Tomioka](https://www.microsoft.com/en-us/research/people/ryoto/), taip pat iš [NeuroWorkshop](http://github.com/shwars/NeuroWorkshop) saugyklos.\n"
"Šis užrašų knygelė yra dalis [AI pradedantiesiems mokymo programos](http://github.com/microsoft/ai-for-beginners) ir buvo parengta [Dmitry Soshnikov](http://soshnikov.com). Ji įkvėpta Neuroninių tinklų dirbtuvių Microsoft Research Cambridge. Kai kurie kodai ir iliustracinės medžiagos paimtos iš pristatymų, kuriuos parengė [Katja Hoffmann](https://www.microsoft.com/en-us/research/people/kahofman/), [Matthew Johnson](https://www.microsoft.com/en-us/research/people/matjoh/) ir [Ryoto Tomioka](https://www.microsoft.com/en-us/research/people/ryoto/), taip pat iš [NeuroWorkshop](http://github.com/shwars/NeuroWorkshop) saugyklos.\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Atsakomybės apribojimas**: \nŠis dokumentas buvo išverstas naudojant AI vertimo paslaugą [Co-op Translator](https://github.com/Azure/co-op-translator). Nors siekiame tikslumo, prašome atkreipti dėmesį, kad automatiniai vertimai gali turėti klaidų ar netikslumų. Originalus dokumentas jo gimtąja kalba turėtų būti laikomas autoritetingu šaltiniu. Kritinei informacijai rekomenduojama naudoti profesionalų žmogaus vertimą. Mes neprisiimame atsakomybės už nesusipratimus ar klaidingus interpretavimus, atsiradusius dėl šio vertimo naudojimo.\n"
"\n---\n\n**Atsakomybės apribojimas**: \nŠis dokumentas buvo išverstas naudojant AI vertimo paslaugą [Co-op Translator](https://github.com/Azure/co-op-translator). Nors siekiame tikslumo, prašome atkreipti dėmesį, kad automatiniai vertimai gali turėti klaidų ar netikslumų. Originalus dokumentas jo gimtąja kalba turėtų būti laikomas autoritetingu šaltiniu. Kritinei informacijai rekomenduojama naudoti profesionalų žmogaus vertimą. Mes neprisiimame atsakomybės už nesusipratimus ar neteisingus aiškinimus, kylančius dėl šio vertimo naudojimo.\n"
]
}
],
@ -1080,8 +1082,8 @@
"start_slideshow_at": "selected"
},
"coopTranslator": {
"original_hash": "914fc55f59efc7e17b8130d4033ac617",
"translation_date": "2025-08-31T13:23:58+00:00",
"original_hash": "d67e5b54ba20b507aa88d71aa3d042d8",
"translation_date": "2025-10-03T13:50:43+00:00",
"source_file": "lessons/3-NeuralNetworks/03-Perceptron/Perceptron.ipynb",
"language_code": "lt"
}

View File

@ -11,11 +11,11 @@
"source": [
"## 感知器\n",
"\n",
"> 筆記本是 [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners) 的一部分。請訪問該倉庫以獲取完整的學習資料。\n",
"> 筆記本是 [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners) 的一部分。請訪問該存儲庫以獲取完整的學習材料。\n",
"\n",
"如我們所討論的,感知器可以用來解決**二元分類問題**也就是將輸入範例分類為兩個類別——我們可以稱它們為**正類**和**負類**。\n",
"如我們所討論的,感知器可以用來解決**二元分類問題**將輸入範例分類為兩個類別——我們可以稱它們為**正類**和**負類**。\n",
"\n",
"首先,讓我們導入一些必要的庫。\n"
"首先,讓我們導入一些所需的庫。\n"
]
},
{
@ -49,7 +49,7 @@
"source": [
"## 玩具問題\n",
"\n",
"首先,讓我們從一個玩具問題開始,這個問題包含兩個輸入特徵。例如,在醫學中,我們可能希望根據腫瘤的大小和年齡將其分類為良性或惡性。\n",
"首先,讓我們從一個玩具問題開始,這裡我們有兩個輸入特徵。例如,在醫學中,我們可能希望根據腫瘤的大小和年齡,將腫瘤分類為良性或惡性。\n",
"\n",
"我們將使用 SciKit Learn 庫中的 `make_classification` 函數生成一個隨機分類數據集:\n"
]
@ -154,7 +154,7 @@
"source": [
"## 感知器\n",
"\n",
"由於感知器是一種二元分類器,對於每個輸入向量 $x$,感知器的輸出將根據所屬的類別為 +1 或 -1。輸出將通過以下公式計算:\n",
"由於感知器是一種二元分類器,對於每個輸入向量 $x$,感知器的輸出將根據所屬的類別為 +1 或 -1。輸出將使用以下公式計算:\n",
"\n",
"$$y(\\mathbf{x}) = f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x})$$\n",
"\n",
@ -166,7 +166,7 @@
" \\end{cases} \\\\\n",
"$$\n",
"\n",
"然而,一般的線性模型通常還需要一個偏置項,也就是說理想情況下我們應該計算 $y$ 為 $y=f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}+\\mathbf{b})$。為了簡化模型,我們可以通過在輸入特徵中添加一個始終等於 1 的維度來除這個偏置項:\n"
"然而,一般的線性模型通常還需要一個偏置項,也就是說理想情況下我們應該計算 $y$ 為 $y=f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}+\\mathbf{b})$。為了簡化模型,我們可以通過在輸入特徵中添加一個始終等於 1 的維度來除這個偏置項:\n"
]
},
{
@ -206,20 +206,20 @@
"source": [
"## 訓練算法\n",
"\n",
"為了訓練感知器,我們需要找出權重 $\\mathbf{w}$,以最小化錯誤。錯誤是通過**感知器準則**定義的:\n",
"為了訓練感知器,我們需要找到權重 $\\mathbf{w}$,以最小化錯誤。錯誤是使用**感知器準則**定義的:\n",
"\n",
"$$E(\\mathbf{w}) = -\\sum_{n \\in \\mathcal{M}}\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}_{n}t_{n}$$\n",
" \n",
" * $t_{n} \\in \\{-1, +1\\}$ 分別對應於負樣本和正樣本\n",
" * $\\mathcal{M}$ - 錯誤分類的樣本集合\n",
" * $t_{n} \\in \\{-1, +1\\}$ 分別代表負樣本和正樣本\n",
" * $\\mathcal{M}$ - 錯誤分類的樣本集合\n",
" \n",
"我們將使用**梯度下降**的過程。從一些初始隨機權重 $\\mathbf{w}^{(0)}$ 開始,我們會在訓練的每一步根據 $E$ 的梯度調整權重:\n",
"我們將使用**梯度下降**的過程。從一些初始隨機權重 $\\mathbf{w}^{(0)}$ 開始,我們會在訓練的每一步根據 $E$ 的梯度調整權重:\n",
"\n",
"$$\\mathbf{w}^{\\tau + 1}=\\mathbf{w}^{\\tau} - \\eta \\nabla E(\\mathbf{w}) = \\mathbf{w}^{\\tau} + \\eta\\sum_{n \\in \\mathcal{M}}\\mathbf{x}_{n} t_{n}$$\n",
"\n",
"其中 $\\eta$ 是**學習率**$\\tau\\in\\mathbb{N}$ 表示迭代次數。\n",
"其中 $\\eta$ 是**學習率**$\\tau\\in\\mathbb{N}$ - 迭代次數。\n",
"\n",
"我們用 Python 定義這個算法:\n"
"以下是用 Python 定義此算法:\n"
]
},
{
@ -271,7 +271,9 @@
{
"cell_type": "markdown",
"metadata": {},
"source": []
"source": [
"現在讓我們在我們的數據集上運行訓練:\n"
]
},
{
"cell_type": "code",
@ -309,9 +311,9 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"如你所見,初始準確率約為 50%,但很快就提升到接近 90% 的高值。\n",
"如你所見,初始準確率約為 50%,但很快就提升到接近 90% 的高值。\n",
"\n",
"讓我們來視覺化類別是如何分開的。我們的分類函數看起來像 $\\mathbf{w}^Tx$,對於某一類別,它大於 0對於另一類別小於 0。因此類別分隔線由 $\\mathbf{w}^Tx = 0$ 定義。由於我們只有兩個維度 $x_0$ 和 $x_1$,該直線的方程式為 $w_0x_0+w_1x_1+w_2 = 0$(記住,我們已明確定義了一個額外的維度 $x_2=1$)。讓我們繪製這條直線:\n"
"讓我們來視覺化類別的分隔情況。我們的分類函數形式為 $\\mathbf{w}^Tx$,對於某一類別,其值大於 0而對於另一類別其值則小於 0。因此類別分隔線由 $\\mathbf{w}^Tx = 0$ 定義。由於我們只有兩個維度 $x_0$ 和 $x_1$,該直線的方程式為 $w_0x_0+w_1x_1+w_2 = 0$(記住,我們已明確定義了一個額外的維度 $x_2=1$)。現在讓我們繪製這條直線:\n"
]
},
{
@ -379,7 +381,7 @@
"source": [
"## 在測試數據集上進行評估\n",
"\n",
"一開始,我們已經將部分數據分離出來作為測試數據集。現在來看看我們的分類器在這個測試數據集上的準確性如何。為了做到這一點,我們需要將測試數據集擴展一個額外的維度,與權重矩陣相乘,並確保得到的值與標籤的符號一致(+1 或 -1。接著我們將所有布林值相加並除以測試樣本的長度來計算準確率\n"
"一開始,我們已經將部分數據分離出來作為測試數據集。現在來看看我們的分類器在這個測試數據集上的準確度如何。為了做到這一點,我們需要將測試數據集擴展一個額外的維度,然後乘以權重矩陣,並確保得到的值與標籤的符號一致(+1 或 -1。接著我們將所有布林值相加並除以測試樣本的長度從而得到準確度\n"
]
},
{
@ -420,7 +422,7 @@
"source": [
"## 觀察訓練過程\n",
"\n",
"我們之前已經看到,準確率在訓練過程中會下降。能夠觀察分隔線在訓練過程中的變化會很有趣。以下的程式碼將所有內容可視化在一個圖表上,您可以移動滑桿來「時光倒流」檢視訓練過程。\n"
"我們之前已經看到,準確率在訓練過程中會下降。能夠看到分隔線在訓練過程中的變化會很有趣。以下的程式碼將所有內容可視化在一個圖表上,您可以移動滑桿來「時光旅行」觀察訓練過程。\n"
]
},
{
@ -527,16 +529,16 @@
"source": [
"## 感知器的限制\n",
"\n",
"如上所述,感知器是一種**線性分類器**。如果兩個類別是**線性可分**的,也就是可以用一條直線分開,那麼感知器可以很好地區分它們。否則,感知器的訓練過程將無法收斂。\n",
"如上所述,感知器是一種**線性分類器**。如果兩個類別是**線性可分**的,也就是可以用一條直線分開,那麼感知器可以很好地區分它們。否則,感知器的訓練過程將無法收斂。\n",
"\n",
"一個最明顯的例子是感知器無法解決的問題,即所謂的**XOR 問題**。我們希望感知器學習 XOR 布林函數,其真值表如下:\n",
"一個最明顯的例子是感知器無法解決的問題,即所謂的**XOR問題**。我們希望感知器學習XOR布林函數其真值表如下\n",
"\n",
"| | 0 | 1 |\n",
"|---|---|---|\n",
"| 0 | 0 | 1 | \n",
"| 1 | 1 | 0 |\n",
"\n",
"讓我們試試看!我們將手動填入所有正樣本和負樣本,然後調用上面定義的訓練函數:\n"
"讓我們試試看!我們將手動填充所有正樣本和負樣本,然後調用我們上面定義的訓練函數:\n"
]
},
{
@ -603,21 +605,21 @@
}
},
"source": [
"從上圖可以看出,準確率從未超過 75%,因為無法畫出一條直線來正確分類所有可能的例子。\n",
"如上圖所示,準確率從未超過 75%,因為不可能畫出一條直線來正確分類所有可能的例子。\n",
"\n",
"XOR 問題是感知器perceptron局限性的經典例,這一點在 1969 年由 Marvin Minsky 和 Seymour Papert 在他們的書籍 [Perceptrons](https://en.wikipedia.org/wiki/Perceptrons_(book)) 中提出。這一觀察限制了神經網絡領域的研究近 10 年儘管如此——我們會在課程的下一節看到——多層感知器multi-layered perceptrons完全能夠解決這類問題。\n",
"XOR 問題是感知器局限性的經典例,這一點在 1969 年由 Marvin Minsky 和 Seymour Papert 在他們的書籍 [Perceptrons](https://en.wikipedia.org/wiki/Perceptrons_(book)) 中指出。這一觀察限制了神經網絡領域的研究近 10 年,儘管——我們會在課程的下一部分看到——多層感知器完全能夠解決這類問題。\n",
"\n",
"## 複雜範例 - MNIST\n",
"\n",
"雖然感知器無法解決 XOR 問題,但它可以解決許多更複雜的問題,例如手寫字符識別。\n",
"儘管感知器無法解決 XOR 問題,但它可以解決許多更複雜的問題,例如手寫字符識別。\n",
"\n",
"在學習機器學習時,經常使用的一個數據集叫做 [MNIST](https://en.wikipedia.org/wiki/MNIST_database)。這個數據集由美國國家標準與技術研究院Modified National Institute of Standards and Technology創建包含一個由 60000 個手寫數字組成的訓練集,這些數字來自該研究院約 250 名學生和員工。此外,還有一個由 10000 個數字組成的測試數據集,這些數字來自不同的個體。\n",
"在學習機器學習時,經常使用的一個數據集叫做 [MNIST](https://en.wikipedia.org/wiki/MNIST_database)。它由美國國家標準技術研究所Modified National Institute of Standards and Technology創建包含一個由 60000 個手寫數字組成的訓練集,這些數字來自研究所的約 250 名學生和員工。此外,還有一個由 10000 個數字組成的測試數據集,這些數字來自不同的個體。\n",
"\n",
"所有數字都以 28x28 像素的灰度圖像表示。\n",
"\n",
"> MNIST 數據集作為一個訓練競賽可在 [Kaggle](https://www.kaggle.com/c/digit-recognizer) 上獲取Kaggle 是一個舉辦機器學習競賽和比賽的網站。一旦你學會如何分類 MNIST 數字,你可以將你的解決方案提交到 Kaggle看看你的表現如何與其他參賽者相比。\n",
"> MNIST 數據集作為一個訓練競賽可在 [Kaggle](https://www.kaggle.com/c/digit-recognizer) 上找到Kaggle 是一個舉辦機器學習競賽和比賽的網站。一旦你學會如何分類 MNIST 數字,你可以將你的解決方案提交到 Kaggle看看它在其他參賽者中的排名。\n",
"\n",
"我們從加載 MNIST 數據集開始\n"
"我們首先載入 MNIST 數據集\n"
]
},
{
@ -693,7 +695,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"因為感知器是一個二元分類器,我們將把問題限制為僅識別兩個數字。以下函數將使用兩個給定的數字填充正樣本和負樣本數組(並且還會顯示這些數字的樣本以便清楚)。\n"
"因為感知器是一個二元分類器,我們將把問題限制在僅識別兩個數字。以下函數將使用兩個給定的數字填充正樣本和負樣本陣列(並且也會顯示這些數字的樣本以便清楚了解)。\n"
]
},
{
@ -829,11 +831,11 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"請注意,準確率會非常快速地接近接近 100%。\n",
"請注意,準確率會非常快速地接近幾乎 100%。\n",
"\n",
"請將滑桿移動到訓練過程接近尾聲的位置,並觀察左側繪製的權重矩陣。這個矩陣將幫助你理解感知器的實際運作方式。你可以看到在矩陣中間的高權重值,這些對應於數字 1 通常出現的像素位置;而在矩陣兩側則是低的負值,這些對應於數字 0 的部分。因此,如果呈現給感知器的數字確實是 1那麼中間部分的像素將與高權重值相乘產生正的結果。相反地當感知器觀察到數字 0 時,對應的像素將與負數相乘。\n",
"請將滑塊移動到訓練過程接近尾聲的位置,並觀察左側繪製的權重矩陣。這個矩陣可以幫助你理解感知器的實際工作原理。你可以看到矩陣中間的高權重值,這些值對應於通常出現在數字 1 中的像素,而矩陣兩側則是低的負值,這些位置通常是數字 0 的部分。因此,如果呈現給感知器的數字確實是 1中間部分的像素會被高權重值相乘產生正的結果。相反地當感知器觀察到數字 0時對應的像素會被負數相乘。\n",
"\n",
"> 你可能會注意到,如果我們給感知器一個稍微水平偏移的數字 1導致其像素佔據了數字 0 垂直部分的位置,那麼我們可能會得到錯誤的結果。由於 MNIST 數據集的特性是所有數字都居中且定位正確,而感知器正是依賴這一點來區分數字。\n",
"> 你可能會注意到,如果我們給感知器一個數字 1並且它稍微水平移動使其像素佔據了數字 0 垂直部分的位置,我們可能會得到錯誤的結果。由於 MNIST 數據集的特性是所有數字都居中且位置正確,感知器依賴這一特性來區分數字。\n",
"\n",
"現在讓我們嘗試不同的數字:\n"
]
@ -911,11 +913,11 @@
"source": [
"## 討論\n",
"\n",
"出於某些原因2 和 5 並不容易完全分開。即使我們的準確率相對較高(超過 85%),我們仍然可以明顯看到感知器在某個時刻停止學習。\n",
"不知何故,數字 2 和 5 並不容易分開。儘管我們的準確率相對較高(超過 85%),但我們可以明顯看到感知器在某個時刻停止學習。\n",
"\n",
"為了理解為什麼會發生這種情況,我們可以嘗試使用[主成分分析](https://en.wikipedia.org/wiki/Principal_component_analysis) (PCA)。這是一種機器學習技術,用於降低輸入數據集的維度,以便獲得最佳的類別可分性。\n",
"為了理解為什麼會發生這種情況,我們可以嘗試使用 [主成分分析](https://en.wikipedia.org/wiki/Principal_component_analysis) (PCA)。這是一種機器學習技術,用於降低輸入數據集的維度,以便獲得最佳的類別可分性。\n",
"\n",
"在我們的例子中,輸入圖像有 784 個像素(輸入特徵),我們希望使用 PCA 將參數數量減少到僅僅 2 個,這樣我們就可以在圖表上繪製它們。這兩個參數將是原始特徵的線性組合,我們可以將這個過程視為“旋轉”我們原本的 784 維空間,並觀察其投影到 2D 空間的結果,直到我們獲得最佳的視角來分離類別。\n"
"在我們的例子中,輸入圖像有 784 個像素(輸入特徵),我們希望使用 PCA 將參數數量減少到僅僅 2 個,這樣我們就可以在圖表上繪製它們。這兩個參數將是原始特徵的線性組合,我們可以將這個過程視為“旋轉”我們原本的 784 維空間,並觀察其在 2D 空間中的投影,直到我們獲得最佳視角來分離類別。\n"
]
},
{
@ -1025,17 +1027,17 @@
}
},
"source": [
"如你所見0 和 1 可以用一條直線清楚地分開。這表明在原始的 784 維空間中,對應於這些數字的點也是線性可分的。而對於 2 和 5我們無法找到一個能清楚分開這些數字的良好投影因此會出現一些錯誤分類的情況。\n",
"如你所見0 和 1 可以明顯地用一條直線分開。這表明在原始的 784 維空間中,對應於這些數字的點也是線性可分的。而對於 2 和 5我們無法找到一個能清楚分開這些數字的良好投影因此會出現一些錯誤分類的情況。\n",
"\n",
"> 在這門課程的後續部分,我們將學習如何使用神經網絡來創建非線性分類器,以及如何處理數字未正確對齊的問題。不久之後,我們將在 MNIST 數字分類中達到超過 99% 的準確率,同時將這些數字分類為 10 個不同的類別。\n",
"> 在這門課程的後續部分,我們將學習如何使用神經網路來建立非線性分類器,以及如何處理數字未正確對齊的問題。不久之後,我們將在 MNIST 數字分類中達到超過 99% 的準確率,將這些數字分類為 10 個不同的類別。\n",
"\n",
"## 重點回顧\n",
"\n",
" * 我們學習了最簡單的神經網架構——單層感知器。\n",
" * 我們手動實現了感知器,使用基於梯度下降的簡單訓練程。\n",
" * 儘管簡單,單層感知器仍能解決手寫數字識別這樣相對複雜的問題。\n",
" * 我們學習了最簡單的神經網架構——單層感知器。\n",
" * 我們手動實現了感知器,使用基於梯度下降的簡單訓練程。\n",
" * 儘管簡單,單層感知器仍能解決相當複雜的手寫數字識別問題。\n",
" * 單層感知器是一種線性分類器,因此它提供的分類能力與邏輯回歸相同。\n",
" * 在樣本空間中,感知器可以使用超平面分開兩類輸入數據。\n"
" * 在樣本空間中,感知器可以使用超平面分開兩類輸入數據。\n"
]
},
{
@ -1044,14 +1046,14 @@
"source": [
"## 致謝\n",
"\n",
"此筆記本是 [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners) 的一部分,由 [Dmitry Soshnikov](http://soshnikov.com) 編寫。靈感來自於微軟劍橋研究院的神經網絡工作坊。一些程式碼和示例材料取自 [Katja Hoffmann](https://www.microsoft.com/en-us/research/people/kahofman/)、[Matthew Johnson](https://www.microsoft.com/en-us/research/people/matjoh/) 和 [Ryoto Tomioka](https://www.microsoft.com/en-us/research/people/ryoto/) 的演示文稿,以及 [NeuroWorkshop](http://github.com/shwars/NeuroWorkshop) 資源庫。\n"
"此筆記本是 [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners) 的一部分,由 [Dmitry Soshnikov](http://soshnikov.com) 編寫。靈感來自於微軟研究院劍橋的神經網絡工作坊。一些代碼和示例材料取自 [Katja Hoffmann](https://www.microsoft.com/en-us/research/people/kahofman/)、[Matthew Johnson](https://www.microsoft.com/en-us/research/people/matjoh/) 和 [Ryoto Tomioka](https://www.microsoft.com/en-us/research/people/ryoto/) 的演示,以及 [NeuroWorkshop](http://github.com/shwars/NeuroWorkshop) 資源庫。\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**免責聲明** \n本文件使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。我們致力於提供準確的翻譯,但請注意,自動翻譯可能包含錯誤或不準確之處。應以原始語言的文件作為權威來源。對於關鍵資訊,建議尋求專業人工翻譯。我們對因使用此翻譯而產生的任何誤解或錯誤解讀概不負責。\n"
"\n---\n\n**免責聲明** \n本文件使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。雖然我們致力於提供準確的翻譯,但請注意,自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應被視為權威來源。對於關鍵資訊,建議使用專業人工翻譯。我們對因使用此翻譯而產生的任何誤解或錯誤解釋不承擔責任。\n"
]
}
],
@ -1080,8 +1082,8 @@
"start_slideshow_at": "selected"
},
"coopTranslator": {
"original_hash": "914fc55f59efc7e17b8130d4033ac617",
"translation_date": "2025-08-29T07:07:26+00:00",
"original_hash": "d67e5b54ba20b507aa88d71aa3d042d8",
"translation_date": "2025-10-03T13:11:57+00:00",
"source_file": "lessons/3-NeuralNetworks/03-Perceptron/Perceptron.ipynb",
"language_code": "mo"
}

View File

@ -13,7 +13,7 @@
"\n",
"> हे नोटबुक [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners) चा एक भाग आहे. संपूर्ण शिक्षण सामग्रीसाठी रेपॉझिटरीला भेट द्या.\n",
"\n",
"जसे आपण चर्चा केली आहे, परसेप्ट्रॉन तुम्हाला **द्वि-वर्गीकरण समस्या** सोडवण्याची परवानगी देते, म्हणजेच इनपुट उदाहरणांना दोन वर्गांमध्ये वर्गीकृत करणे - आपण त्यांना **सकारात्मक** आणि **नकारात्मक** म्हणू शकतो.\n",
"जसे आपण चर्चा केली आहे, परसेप्ट्रॉन तुम्हाला **द्विआधारी वर्गीकरण समस्या** सोडवण्यास अनुमती देते, म्हणजेच इनपुट उदाहरणांना दोन वर्गांमध्ये वर्गीकृत करणे - आपण त्यांना **सकारात्मक** आणि **नकारात्मक** म्हणू शकतो.\n",
"\n",
"सर्वप्रथम, काही आवश्यक लायब्ररी आयात करूया.\n"
]
@ -47,9 +47,9 @@
}
},
"source": [
"## खेळण्यासारखी समस्या\n",
"## खेळण्याचा प्रश्न\n",
"\n",
"सुरुवातीला, आपण एक साधी समस्या घेऊ, जिथे आपल्याकडे दोन इनपुट वैशिष्ट्ये आहेत. उदाहरणार्थ, वैद्यकीय क्षेत्रात, आपण ट्यूमरचा आकार आणि वय यावर आधारित त्यांना सौम्य आणि घातक वर्गांमध्ये वर्गीकृत करू इच्छितो.\n",
"सुरुवातीला, आपण एका साध्या समस्येपासून सुरुवात करूया, जिथे आपल्याकडे दोन इनपुट वैशिष्ट्ये आहेत. उदाहरणार्थ, वैद्यकीय क्षेत्रात, आपण ट्यूमरचा आकार आणि वय यावर आधारित त्यांना सौम्य आणि घातक वर्गांमध्ये वर्गीकृत करू इच्छितो.\n",
"\n",
"आपण SciKit Learn लायब्ररीमधील `make_classification` फंक्शन वापरून एक रँडम वर्गीकरण डेटासेट तयार करू:\n"
]
@ -95,7 +95,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"चला डेटासेट देखील प्लॉट करूया:\n"
"चला डेटा सेट देखील प्लॉट करूया:\n"
]
},
{
@ -154,11 +154,11 @@
"source": [
"## परसेप्ट्रॉन\n",
"\n",
"परसेप्ट्रॉन हा एक बायनरी वर्गीकरण करणारा मॉडेल असल्यामुळे, प्रत्येक इनपुट व्हेक्टर $x$ साठी परसेप्ट्रॉनचा आउटपुट +1 किंवा -1 पैकी एक असेल, जो वर्गावर अवलंबून असेल. आउटपुट खालील सूत्राचा वापर करून काढला जाईल:\n",
"परसेप्ट्रॉन हा एक द्विआधारी वर्गीकरण करणारा मॉडेल असल्यामुळे, प्रत्येक इनपुट वेक्टर $x$ साठी परसेप्ट्रॉनचा आउटपुट +1 किंवा -1 असेल, वर्गावर अवलंबून. आउटपुट खालील सूत्राने गणना केली जाईल:\n",
"\n",
"$$y(\\mathbf{x}) = f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x})$$\n",
"\n",
"इथे $\\mathbf{w}$ हा वेट व्हेक्टर आहे, आणि $f$ ही एक स्टेप अॅक्टिव्हेशन फंक्शन आहे:\n",
"जिथे $\\mathbf{w}$ हा वजन वेक्टर आहे, आणि $f$ हा स्टेप अॅक्टिवेशन फंक्शन आहे:\n",
"$$\n",
"f(x) = \\begin{cases}\n",
" +1 & x \\geq 0 \\\\\n",
@ -166,7 +166,7 @@
" \\end{cases} \\\\\n",
"$$\n",
"\n",
"तथापि, एक सामान्य रेषीय मॉडेलमध्ये बायस असणे आवश्यक आहे, म्हणजेच आदर्शतः $y$ चे गणन $y=f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}+\\mathbf{b})$ या प्रकारे केले पाहिजे. आपले मॉडेल सोपे करण्यासाठी, आपण इनपुट फिचर्समध्ये एक नवीन डायमेंशन जोडू शकतो, ज्याची किंमत नेहमी 1 असेल, यामुळे बायस टर्म काढून टाकता येईल:\n"
"तथापि, एक सामान्य रेषीय मॉडेलमध्ये बायस देखील असावा, म्हणजेच आदर्शतः $y$ ची गणना $y=f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}+\\mathbf{b})$ अशी केली पाहिजे. आपले मॉडेल सोपे करण्यासाठी, आपण इनपुट फीचर्समध्ये एक अतिरिक्त डायमेन्शन जोडू शकतो, ज्याचे मूल्य नेहमी 1 असेल, ज्यामुळे बायस टर्म काढून टाकता येईल:\n"
]
},
{
@ -206,18 +206,18 @@
"source": [
"## प्रशिक्षण अल्गोरिदम\n",
"\n",
"पर्सेप्ट्रॉन प्रशिक्षणासाठी, आपल्याला $\\mathbf{w}$ वजन शोधावे लागतील जे त्रुटी कमी करतील. त्रुटी **पर्सेप्ट्रॉन निकष** वापरून परिभाषित केली जाते:\n",
"पर्सेप्ट्रॉन प्रशिक्षणासाठी, आपल्याला अशा वजनांचा ($\\mathbf{w}$) शोध घ्यायचा आहे जे त्रुटी कमी करतील. त्रुटी **पर्सेप्ट्रॉन निकष** वापरून परिभाषित केली जाते:\n",
"\n",
"$$E(\\mathbf{w}) = -\\sum_{n \\in \\mathcal{M}}\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}_{n}t_{n}$$\n",
" \n",
" * $t_{n} \\in \\{-1, +1\\}$ नकारात्मक आणि सकारात्मक प्रशिक्षण नमुन्यांसाठी अनुक्रमे\n",
" * $\\mathcal{M}$ - चुकीच्या वर्गीकृत उदाहरणांचा संच\n",
" \n",
"आपण **ग्रेडियंट डिसेंट** प्रक्रिया वापरणार आहोत. प्रारंभिक यादृच्छिक वजन $\\mathbf{w}^{(0)}$ पासून सुरुवात करून, प्रशिक्षणाच्या प्रत्येक टप्प्यावर $E$ च्या ग्रेडियंटचा वापर करून वजन समायोजित करू:\n",
"आपण **ग्रेडियंट डिसेंट** प्रक्रिया वापरणार आहोत. काही प्रारंभिक यादृच्छिक वजन $\\mathbf{w}^{(0)}$ पासून सुरुवात करून, प्रशिक्षणाच्या प्रत्येक टप्प्यावर $E$ च्या ग्रेडियंटचा वापर करून वजन समायोजित करू:\n",
"\n",
"$$\\mathbf{w}^{\\tau + 1}=\\mathbf{w}^{\\tau} - \\eta \\nabla E(\\mathbf{w}) = \\mathbf{w}^{\\tau} + \\eta\\sum_{n \\in \\mathcal{M}}\\mathbf{x}_{n} t_{n}$$\n",
"\n",
"इथे $\\eta$ म्हणजे **लर्निंग रेट**, आणि $\\tau\\in\\mathbb{N}$ - पुनरावृत्तीची संख्या.\n",
"जिथे $\\eta$ हा **शिकण्याचा दर** आहे, आणि $\\tau\\in\\mathbb{N}$ - पुनरावृत्तीची संख्या.\n",
"\n",
"चला हा अल्गोरिदम Python मध्ये परिभाषित करू:\n"
]
@ -271,7 +271,9 @@
{
"cell_type": "markdown",
"metadata": {},
"source": []
"source": [
"आता आपण आपल्या डेटासेटवर प्रशिक्षण चालवूया:\n"
]
},
{
"cell_type": "code",
@ -309,9 +311,9 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"जसे तुम्ही पाहू शकता, सुरुवातीची अचूकता सुमारे 50% आहे, प ती लवकरच वाढून 90% च्या जवळ पोहोचते.\n",
"जसे तुम्ही पाहू शकता, सुरुवातीची अचूकता सुमारे 50% आहे, परंतु ती लवकरच वाढून 90% च्या जवळ पोहोचते.\n",
"\n",
"चला वर्ग कसे वेगळे केले जातात ते पाहूया. आपले वर्गीकरण फंक्शन $\\mathbf{w}^Tx$ असे दिसते, आणि ते एका वर्गासाठी 0 पेक्षा जास्त असते, तर दुसऱ्या वर्गासाठी 0 पेक्षा कमी असते. त्यामुळे, वर्ग विभाजन रेषा $\\mathbf{w}^Tx = 0$ ने परिभाषित केली जाते. कारण आपल्याकडे फक्त दोन परिमाणे $x_0$ आणि $x_1$ आहेत, रेषेसाठी समीकरण असे असेल $w_0x_0+w_1x_1+w_2 = 0$ (लक्षात ठेवा की आपण स्पष्टपणे एक अतिरिक्त परिमाण $x_2=1$ परिभाषित केले आहे). चला ही रेषा प्लॉट करूया:\n"
"आता वर्ग कसे विभाजित केले जातात ते पाहूया. आमचे वर्गीकरण कार्य $\\mathbf{w}^Tx$ सारखे दिसते, आणि ते एका वर्गासाठी 0 पेक्षा जास्त आहे, तर दुसऱ्या वर्गासाठी 0 पेक्षा कमी आहे. त्यामुळे, वर्ग विभाजन रेषा $\\mathbf{w}^Tx = 0$ ने परिभाषित केली जाते. कारण आपल्याकडे फक्त दोन परिमाणे $x_0$ आणि $x_1$ आहेत, रेषेसाठी समीकरण $w_0x_0+w_1x_1+w_2 = 0$ असेल (लक्षात ठेवा की आपण स्पष्टपणे एक अतिरिक्त परिमाण $x_2=1$ परिभाषित केले आहे). चला ही रेषा प्लॉट करूया:\n"
]
},
{
@ -377,9 +379,9 @@
}
},
"source": [
"## चाचणी डेटासेटवर मूल्यमापन करा\n",
"## चाचणी डेटासेटवर मूल्यांकन करा\n",
"\n",
"सुरुवातीला, आम्ही काही डेटा वेगळा ठेवून चाचणी डेटासेट तयार केला आहे. चला पाहूया की आमचा वर्गीकरणकर्ता या चाचणी डेटासेटवर किती अचूक आहे. हे करण्यासाठी, आम्ही चाचणी डेटासेटमध्ये एक अतिरिक्त परिमाण जोडतो, वजन मॅट्रिक्सने गुणाकार करतो, आणि खात्री करतो की मिळालेली किंमत लेबल (+1 किंवा -1) सारखीच चिन्ह असलेली आहे. त्यानंतर आम्ही सर्व बूलियन मूल्ये एकत्र करतो आणि चाचणी नमुन्याच्या लांबीने भागून अचूकता प्राप्त करतो:\n"
"सुरुवातीला, आम्ही काही डेटा चाचणी डेटासेटसाठी वेगळा ठेवला आहे. चला पाहूया की आमचा वर्गीकरणकर्ता या चाचणी डेटासेटवर किती अचूक आहे. हे करण्यासाठी, आम्ही चाचणी डेटासेटमध्ये एक अतिरिक्त परिमाण जोडतो, वजन मॅट्रिक्सने गुणाकार करतो आणि सुनिश्चित करतो की प्राप्त मूल्य लेबलसारखेच चिन्ह (+1 किंवा -1) आहे. त्यानंतर आम्ही सर्व बूलियन मूल्ये एकत्र करतो आणि चाचणी नमुन्याच्या लांबीने भाग देतो, अचूकता मिळवण्यासाठी:\n"
]
},
{
@ -418,9 +420,9 @@
}
},
"source": [
"## प्रशिक्षण प्रक्रियेचे निरीक्षण करणे\n",
"## प्रशिक्षण प्रक्रिय निरीक्षण करणे\n",
"\n",
"आम्ही यापूर्वी पाहिले आहे की प्रशिक्षणादरम्यान अचूकता कशी कमी होते. प्रशिक्षणादरम्यान विभाजन रेषा कशी वागते हे पाहणे छान होईल. खालील कोड सर्वकाही एका ग्राफवर दृश्यमान करेल, आणि तुम्ही स्लायडर हलवून प्रशिक्षण प्रक्रियेच्या \"वेळ प्रवास\"ाचा अनुभव घेऊ शकाल.\n"
"आपण यापूर्वी पाहिले आहे की प्रशिक्षणादरम्यान अचूकता कशी कमी होते. प्रशिक्षणादरम्यान विभाजन रेषा कशी वागते हे पाहणे छान होईल. खालील कोड सर्वकाही एका ग्राफवर दृश्यमान करेल, आणि तुम्ही स्लायडर हलवून प्रशिक्षण प्रक्रियेत \"वेळ प्रवास\" करू शकाल.\n"
]
},
{
@ -527,9 +529,9 @@
"source": [
"## परसेप्ट्रॉनची मर्यादा\n",
"\n",
"जसे तुम्ही वर पाहिले, परसेप्ट्रॉन हा एक **रेखीय वर्गीकरण करणारा** आहे. जर दोन वर्ग **रेखीय विभाजनीय** असतील, म्हणजे सरळ रेषेने विभाजित करता येत असतील, तर तो त्यांच्यातील फरक व्यवस्थित ओळखू शकतो. अन्यथा, परसेप्ट्रॉन प्रशिक्षण प्रक्रिया यशस्वी होणार नाही.\n",
"जसे तुम्ही वर पाहिले, परसेप्ट्रॉन हा **रेखीय वर्गीकरणकर्ता** आहे. जर दोन वर्ग **रेखीय विभाज्य** असतील, म्हणजे सरळ रेषेने विभाजित करता येत असतील, तर तो त्यांच्यातील फरक व्यवस्थित ओळखू शकतो. अन्यथा, परसेप्ट्रॉन प्रशिक्षण प्रक्रिया यशस्वी होणार नाही.\n",
"\n",
"परसेप्ट्रॉनद्वारे सोडवता न येणाऱ्या समस्येचे सर्वात स्पष्ट उदाहरण म्हणजे **XOR समस्या**. आपल्याला परसेप्ट्रॉनला XOR बूलियन फंक्शन शिकवायचे आहे, ज्याचे खालील सत्य टेबल आहे:\n",
"परसेप्ट्रॉनद्वारे सोडवता न येणाऱ्या समस्येचे सर्वात स्पष्ट उदाहरण म्हणजे **XOR समस्या**. आपल्याला परसेप्ट्रॉनने XOR बूलियन फंक्शन शिकावे असे वाटते, ज्याचे सत्य टेबल खालीलप्रमाणे आहे:\n",
"\n",
"| | 0 | 1 |\n",
"|---|---|---|\n",
@ -603,19 +605,19 @@
}
},
"source": [
"वर दिलेल्या ग्राफवरून तुम्ही पाहू शकता की अचूकता कधीच 75% पेक्षा जास्त होत नाही, कारण सर्व उदाहरणे योग्यरीत्या मिळवण्यासाठी सरळ रेषा काढणे अशक्य आहे.\n",
"जसे तुम्ही वरच्या ग्राफमधून पाहू शकता, अचूकता कधीच 75% पेक्षा जास्त होत नाही, कारण अशी सरळ रेषा काढणे अशक्य आहे ज्यामुळे सर्व उदाहरणे योग्य ठरतील.\n",
"\n",
"XOR समस्या ही परसेप्ट्रॉनच्या मर्यादांची एक पारंपरिक उदाहरण आहे, आणि मार्विन मिंस्की आणि सीमोर पॅपर्ट यांनी 1969 मध्ये त्यांच्या [Perceptrons](https://en.wikipedia.org/wiki/Perceptrons_(book)) या पुस्तकात याचा उल्लेख केला होता. या निरीक्षणामुळे न्यूरल नेटवर्क्सच्या क्षेत्रातील संशोधन जवळजवळ 10 वर्षे मर्यादित झाले, जरी - आणि आपण आपल्या अभ्यासक्रमाच्या पुढील विभागात हे पाहू - मल्टी-लेयर्ड परसेप्ट्रॉन अशा समस्यांचे निराकरण करण्यास पूर्णपणे सक्षम आहेत.\n",
"XOR समस्या ही परसेप्ट्रॉनच्या मर्यादांचे एक क्लासिकल उदाहरण आहे, आणि 1969 मध्ये मार्विन मिन्स्की आणि सीमोर पॅपर्ट यांनी त्यांच्या [Perceptrons](https://en.wikipedia.org/wiki/Perceptrons_(book)) या पुस्तकात याचा उल्लेख केला होता. या निरीक्षणामुळे न्यूरल नेटवर्क्सच्या क्षेत्रातील संशोधन जवळजवळ 10 वर्षे मर्यादित राहिले, जरी - आणि आपण आपल्या कोर्सच्या पुढील विभागात हे पाहू - मल्टी-लेयर्ड परसेप्ट्रॉन्स अशा समस्यांचे निराकरण करण्यास पूर्णपणे सक्षम आहेत.\n",
"\n",
"## जटिल उदाहरण - MNIST\n",
"\n",
"जरी परसेप्ट्रॉन XOR समस्या सोडवू शकत नाही, तरी ते हस्तलिखित अक्षर ओळखण्यासारख्या अनेक अधिक जटिल समस्या सोडवू शकते.\n",
"\n",
"मशीन लर्निंग शिकताना वापरला जाणारा एक डेटासेट [MNIST](https://en.wikipedia.org/wiki/MNIST_database) म्हणून ओळखला जातो. हे मॉडिफाइड नॅशनल इन्स्टिट्यूट ऑफ स्टँडर्ड्स अँड टेक्नॉलॉजीने तयार केले आहे आणि यात 60000 हस्तलिखित अंकांचा प्रशिक्षण संच आहे, जो सुमारे 250 विद्यार्थी आणि संस्थेच्या कर्मचाऱ्यांकडून गोळा केला आहे. याशिवाय, 10000 अंकांचा चाचणी डेटासेट आहे, जो वेगवेगळ्या व्यक्तींमधून गोळा केला आहे.\n",
"मशीन लर्निंग शिकताना वापरला जाणारा एक डेटासेट [MNIST](https://en.wikipedia.org/wiki/MNIST_database) म्हणून ओळखला जातो. हे Modified National Institute of Standards and Technology द्वारे तयार केले गेले आहे आणि यात 60000 हस्तलिखित अंकांचा प्रशिक्षण संच आहे, जो सुमारे 250 विद्यार्थी आणि संस्थेच्या कर्मचाऱ्यांकडून गोळा केला गेला आहे. याशिवाय, 10000 अंकांचा एक चाचणी डेटासेट आहे, जो वेगवेगळ्या व्यक्तींमधून गोळा केला गेला आहे.\n",
"\n",
"सर्व अंक 28x28 पिक्सल आकाराच्या ग्रेस्केल प्रतिमांद्वारे दर्शवले जातात.\n",
"सर्व अंक 28x28 पिक्सल आकाराच्या ग्रेस्केल प्रतिमांद्वारे दर्शवले जातात.\n",
"\n",
"> MNIST डेटासेट [Kaggle](https://www.kaggle.com/c/digit-recognizer) वर प्रशिक्षण स्पर्धा म्हणून उपलब्ध आहे, जे मशीन लर्निंग स्पर्धा आणि स्पर्धा आयोजित करणारे एक साइट आहे. एकदा तुम्ही MNIST अंक वर्गीकृत करणे शिकलात की, तुम्ही तुमचे समाधान Kaggle वर सबमिट करू शकता आणि इतर सहभागींच्या तुलनेत त्याचे मूल्यांकन कसे होते ते पाहू शकता.\n",
"> MNIST डेटासेट [Kaggle](https://www.kaggle.com/c/digit-recognizer) वर प्रशिक्षण स्पर्धा म्हणून उपलब्ध आहे, जे मशीन लर्निंग स्पर्धा आणि स्पर्धा आयोजित करणारे एक साइट आहे. एकदा तुम्ही MNIST अंक वर्गीकृत करणे शिकलात, तेव्हा तुम्ही तुमचे समाधान Kaggle वर सबमिट करू शकता आणि इतर सहभागींच्या तुलनेत त्याचे रेटिंग पाहू शकता.\n",
"\n",
"आम्ही MNIST डेटासेट लोड करून सुरुवात करतो:\n"
]
@ -642,7 +644,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"आता आपण डेटासेट प्लॉट करूया:\n"
"आता डेटासेट प्लॉट करूया:\n"
]
},
{
@ -693,7 +695,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"कारण परसेप्ट्रॉन हा एक द्वि-श्रेणी वर्गीकर्ता आहे, त्यामुळे आपण आपली समस्या फक्त दोन अंक ओळखण्यापुरती मर्यादित ठेवू. खालील फंक्शन दोन दिलेल्या अंकांसह सकारात्मक आणि नकारात्मक नमुना अॅरे भरून काढेल (आणि स्पष्टतेसाठी त्या अंकांचे नमुने देखील दाखवेल).\n"
"कारण परसेप्ट्रॉन हा एक द्विआधारी वर्गीकरण करणारा आहे, त्यामुळे आपण आपली समस्या केवळ दोन अंक ओळखण्यापुरती मर्यादित ठेवू. खालील फंक्शन दोन दिलेल्या अंकांसह सकारात्मक आणि नकारात्मक नमुना अॅरे भरून काढेल (आणि स्पष्टतेसाठी त्या अंकांचे नमुने देखील दाखवेल).\n"
]
},
{
@ -732,7 +734,9 @@
{
"cell_type": "markdown",
"metadata": {},
"source": []
"source": [
"आम्ही 0 आणि 1 यांच्यात वर्गीकरण करण्याचा प्रयत्न करून सुरुवात करू:\n"
]
},
{
"cell_type": "code",
@ -829,11 +833,11 @@
"source": [
"कृपया लक्षात घ्या की अचूकता खूप वेगाने जवळजवळ 100% पर्यंत पोहोचते.\n",
"\n",
"कृपया प्रशिक्षणाच्या शेवटाकडे स्लायडर हलवा आणि डावीकडे प्लॉट केलेले वजन मॅट्रिक्स निरीक्षण करा. हे मॅट्रिक्स तुम्हाला समजून घेण्यास मदत करेल की परसेप्ट्रॉन प्रत्यक्षात कसे कार्य करते. तुम्हाला क्षेत्राच्या मध्यभागी उच्च वजन मूल्ये दिसतील, जी सहसा अंक 1 साठी असलेल्या पिक्सल्सशी संबंधित असतात, आणि बाजूंना कमी नकारात्मक मूल्ये दिसतील, जिथे अंक 0 च्या भागांचा समावेश असतो. त्यामुळे, जर परसेप्ट्रॉनला सादर केलेला अंक खरोखरच 1 असेल, तर त्याचा मध्यभाग उच्च मूल्यांनी गुणाकार केला जाईल, ज्यामुळे सकारात्मक परिणाम मिळेल. उलट, जेव्हा परसेप्ट्रॉन 0 पाहतो, तेव्हा संबंधित पिक्सल्स नकारात्मक संख्यांनी गुणाकार केले जातील.\n",
"कृपया, प्रशिक्षणाच्या शेवटच्या टप्प्याजवळ स्लायडर हलवा आणि डाव्या बाजूला प्लॉट केलेले वजन मॅट्रिक्स पाहा. हे मॅट्रिक्स तुम्हाला समजून घेण्यास मदत करेल की परसेप्ट्रॉन प्रत्यक्षात कसे कार्य करते. तुम्ह क्षेत्राच्या मध्यभागी उच्च वजन मूल्ये पाहू शकता, जी सहसा अंक 1 साठी असलेल्या पिक्सल्सशी संबंधित असतात, आणि बाजूला कमी नकारात्मक मूल्ये असतात, जिथे अंक 0 च्या भाग असतात. त्यामुळे, जर परसेप्ट्रॉनला सादर केलेला अंक प्रत्यक्षात 1 असेल, तर त्याचा मध्यभाग उच्च मूल्यांनी गुणाकार केला जाईल, ज्यामुळे सकारात्मक परिणाम मिळेल. उलट, जेव्हा परसेप्ट्रॉन 0 पाहतो, तेव्हा संबंधित पिक्सल्स नकारात्मक संख्यांनी गुणाकार केले जातील.\n",
"\n",
"> तुम्ही हे लक्षात घेऊ शकता की जर आपण आपल्या परसेप्ट्रॉनला थोडासा आडवा हलवलेला अंक 1 दिला, ज्यामुळे त्याचे पिक्सेल्स अशा ठिकाणी जातील जिथे 0 चे उभे भाग असतात, तर आपल्याला चुकीचा परिणाम मिळू शकतो. कारण आमच्या MNIST डेटासेटची रचना अशी आहे की सर्व अंक केंद्रित आणि योग्यरित्या स्थित असतात, आणि परसेप्ट्रॉन यावर अवलंबून असतो अंकांमधील फरक ओळखण्यासाठी.\n",
"> तुम्ही हे लक्षात घेऊ शकता की जर आपण आपल्या परसेप्ट्रॉनला अंक 1 थोडासा आडवा हलवून दिला, ज्यामुळे त्याचे पिक्सल्स अशा ठिकाणी येतील जिथे 0 च्या उभ्या भाग आहेत, तर आपल्याला चुकीचा परिणाम मिळू शकतो. कारण आमच्या MNIST डेटासेटची रचना अशी आहे की सर्व अंक केंद्रित आणि योग्य प्रकारे स्थित आहेत, आणि परसेप्ट्रॉन यावर आधारित आहे की अंकांमध्ये फरक कसा करायचा.\n",
"\n",
"आता वेगवेगळ्या अंकांचा प्रयत्न करूया:\n"
"आता वेगवेगळे अंक वापरून पाहूया:\n"
]
},
{
@ -909,11 +913,11 @@
"source": [
"## चर्चा\n",
"\n",
"काही कारणांमुळे, 2 आणि 5 यांना सहजपणे वेगळं करता येत नाही. जरी आपल्याला तुलनेने उच्च अचूकता (85% पेक्षा जास्त) मिळत असली तरी, आपण स्पष्टपणे पाहू शकतो की काही टप्प्यावर perceptron शिकणं थांबवतं.\n",
"काही कारणांमुळे, 2 आणि 5 इतक्या सहजपणे वेगळ्या करता येत नाहीत. जरी आपल्याला तुलनेने उच्च अचूकता (85% पेक्षा जास्त) मिळत असली तरी, आपण स्पष्टपणे पाहू शकतो की काही टप्प्यावर perceptron शिकणे थांबवते.\n",
"\n",
"हे का घडतंय हे समजून घेण्यासाठी, आपण [Principal Component Analysis](https://en.wikipedia.org/wiki/Principal_component_analysis) (PCA) वापरून पाहू शकतो. ही एक मशीन लर्निंग तंत्र आहे जी इनपुट डेटासेटची परिमाण कमी करण्यासाठी वापरली जाते, अशा प्रकारे की वर्गांमधील सर्वोत्तम वेगळेपणा मिळवता येईल.\n",
"हे का घडत हे समजून घेण्यासाठी, आपण [Principal Component Analysis](https://en.wikipedia.org/wiki/Principal_component_analysis) (PCA) वापरण्याचा प्रयत्न करू शकतो. ही एक मशीन लर्निंग तंत्र आहे जी इनपुट डेटासेटची परिमाण कमी करण्यासाठी वापरली जाते, ज्यामुळे वर्गांमधील सर्वोत्तम वेगळेपणा मिळतो.\n",
"\n",
"आपल्या बाबतीत, एका इनपुट प्रतिमेमध्ये 784 पिक्सेल्स (इनपुट वैशिष्ट्ये) असतात, आणि आपण PCA चा वापर करून पॅरामीटर्सची संख्या फक्त 2 पर्यंत कमी करू इच्छितो, जेणेकरून आपण त्यांना ग्राफवर प्लॉट करू शकू. हे दोन पॅरामीटर्स मूळ वैशिष्ट्यांचे रेषीय संयोजन असतील, आणि आपण या प्रक्रियेला असे पाहू शकतो की आपण मूळ 784-परिमाणीय जागेला \"फिरवत\" आहोत आणि त्याच्या 2D-स्थानातील प्रक्षेपणाचे निरीक्षण करत आहोत, जोपर्यंत वर्गांना वेगळं करण्यासाठी सर्वोत्तम दृश्य मिळत नाही.\n"
"आपल्या बाबतीत, इनपुट प्रतिमेमध्ये 784 पिक्सेल (इनपुट वैशिष्ट्ये) आहेत, आणि आम्हाला PCA वापरून पॅरामीटर्सची संख्या फक्त 2 पर्यंत कमी करायची आहे, जेणेकरून आम्ही त्यांना ग्राफवर प्लॉट करू शकू. हे दोन पॅरामीटर्स मूळ वैशिष्ट्यांचे रेखीय संयोजन असतील, आणि आपण या प्रक्रियेचा विचार \"आपल्या मूळ 784-परिमाणीय जागेचे फिरवणे\" म्हणून करू शकतो आणि त्याचे प्रक्षेपण 2D-स्थलावर पाहू शकतो, जोपर्यंत वर्ग वेगळे करण्यासाठी सर्वोत्तम दृश्य मिळत नाही.\n"
]
},
{
@ -1023,17 +1027,17 @@
}
},
"source": [
"जसे तुम्ही पाहू शकता, 0 आणि 1 यांना सरळ रेषेने स्पष्टपणे वेगळे करता येते. याचा अर्थ असा की मूळ 784-आयामी जागेत अंकांशी संबंधित बिंदू देखील रेषीय विभाजनीय आहेत. 2 आणि 5 च्या बाबतीत, अंकांना स्पष्टपणे वेगळे करणारे चांगले प्रक्षेपण शोधता येत नाही, आणि त्यामुळे चुकीच्या वर्गीकरणाच्या काही घटना घडतात.\n",
"जसे तुम्ही पाहू शकता, 0 आणि 1 यांना सरळ रेषेने स्पष्टपणे वेगळे करता येते. याचा अर्थ असा की मूळ 784-डायमेन्शनल स्पेसमध्ये अंकांशी संबंधित बिंदू देखील रेषात्मकपणे वेगळे करता येतात. 2 आणि 5 च्या बाबतीत, अंकांना स्पष्टपणे वेगळे करणारी चांगली प्रोजेक्शन शोधता येत नाही, आणि त्यामुळे चुकीच्या वर्गीकरणाच्या काही उदाहरणे दिसून येतात.\n",
"\n",
"> या कोर्समध्ये पुढे आपण Neural Networks वापरून रेषीय नसलेले वर्गीकरण कसे तयार करायचे हे शिकू, तसेच अंक योग्य प्रकारे संरेखित नसल्याच्या समस्येचा सामना कसा करायचा हे देखील शिकू. लवकरच आपण MNIST अंक वर्गीकरणामध्ये 99% पेक्षा जास्त अचूकता गाठू, जिथे आपण त्यांना 10 वेगवेगळ्या वर्गांमध्ये वर्गीकृत कर.\n",
"> या कोर्समध्ये पुढे आपण Neural Networks वापरून नॉन-लिनियर क्लासिफायर्स कसे तयार करायचे ते शिकणार आहोत, आणि अंक योग्य प्रकारे न जुळण्याच्या समस्येवर कसे मात करायचे तेही शिकणार आहोत. लवकरच आपण MNIST अंक वर्गीकरणामध्ये 99% पेक्षा जास्त अचूकता गाठणार आहोत, आणि त्यांना 10 वेगवेगळ्या वर्गांमध्ये वर्गीकृत करणार आहोत.\n",
"\n",
"## मुख्य मुद्दे\n",
"\n",
" * आपण सर्वात सोपी neural network आर्किटेक्चर - एक-स्तरीय perceptron बद्दल शिकलो.\n",
" * आपण perceptron \"हाताने\" अंमलात आणला, gradient descent आधारित साध्या प्रशिक्षण प्रक्रियेचा वापर करून.\n",
" * साधेपण असूनही, एक-स्तरीय perceptron हस्तलिखित अंक ओळखण्याच्या तुलनेने जटिल समस्या सोडवू शकतो.\n",
" * एक-स्तरीय perceptron हा रेषीय वर्गीकरण करणारा आहे, आणि त्यामुळे तो logistic regression इतकीच वर्गीकरण क्षमता प्रदान करतो.\n",
" * नमुना जागेत, perceptron इनपुट डेटाच्या दोन वर्गांना hyperplane चा वापर करून वेगळे करू शकतो.\n"
" * आपण सर्वात सोप्या Neural Network आर्किटेक्चर - एक-लेयर Perceptron बद्दल शिकले.\n",
" * आपण Perceptron \"हाताने\" अंमलात आणले, ज्यामध्ये gradient descent आधारित सोपी प्रशिक्षण प्रक्रिया वापरली.\n",
" * साधेपणा असूनही, एक-लेयर Perceptron हस्तलिखित अंक ओळखण्याचे तुलनेने जटिल समस्या सोडवू शकतो.\n",
" * एक-लेयर Perceptron हा एक रेषात्मक वर्गीकरणकर्ता आहे, आणि त्यामुळे तो logistic regression इतकीच वर्गीकरण क्षमता प्रदान करतो.\n",
" * सॅम्पल स्पेसमध्ये, Perceptron हायपरप्लेन वापरून इनपुट डेटाच्या दोन वर्गांना वेगळे करू शकतो.\n"
]
},
{
@ -1042,14 +1046,14 @@
"source": [
"## श्रेय\n",
"\n",
"ह नोटबुक [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners) चा एक भाग आहे आणि [दिमित्री सोश्निकोव्ह](http://soshnikov.com) यांनी तयार केली आहे. ही नोटबुक Microsoft Research Cambridge येथील Neural Network Workshop वरून प्रेरित आहे. काही कोड आणि चित्रात्मक सामग्री [काट्जा हॉफमन](https://www.microsoft.com/en-us/research/people/kahofman/), [मॅथ्यू जॉन्सन](https://www.microsoft.com/en-us/research/people/matjoh/) आणि [र्योतो टोमिओका](https://www.microsoft.com/en-us/research/people/ryoto/) यांच्या सादरीकरणांमधून घेतली आहे, तसेच [NeuroWorkshop](http://github.com/shwars/NeuroWorkshop) रेपॉजिटरीमधून घेतली आहे.\n"
"ह नोटबुक [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners) चा एक भाग आहे आणि [Dmitry Soshnikov](http://soshnikov.com) यांनी तयार केले आहे. हे Microsoft Research Cambridge मधील Neural Network Workshop वर आधारित आहे. काही कोड आणि चित्रात्मक सामग्री [Katja Hoffmann](https://www.microsoft.com/en-us/research/people/kahofman/), [Matthew Johnson](https://www.microsoft.com/en-us/research/people/matjoh/) आणि [Ryoto Tomioka](https://www.microsoft.com/en-us/research/people/ryoto/) यांच्या सादरीकरणांमधून घेतली आहे, तसेच [NeuroWorkshop](http://github.com/shwars/NeuroWorkshop) रेपॉझिटरीमधून देखील घेतली आहे.\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**अस्वीकरण**: \nहा दस्तऐवज AI भाषांतर सेवा [Co-op Translator](https://github.com/Azure/co-op-translator) चा वापर करून भाषांतरित करण्यात आला आहे. आम्ही अचूकतेसाठी प्रयत्नशील असलो तरी, कृपया लक्षात घ्या की स्वयंचलित भाषांतरांमध्ये त्रुटी किंवा अचूकतेचा अभाव असू शकतो. मूळ भाषेतील मूळ दस्तऐवज हा अधिकृत स्रोत मानला जावा. महत्त्वाच्या माहितीसाठी व्यावसायिक मानवी भाषांतराची शिफारस केली जाते. या भाषांतराचा वापर केल्यामुळे उद्भवणाऱ्या कोणत्याही गैरसमज किंवा चुकीच्या अर्थासाठी आम्ही जबाबदार राहणार नाही.\n"
"\n---\n\n**अस्वीकरण**: \nहा दस्तऐवज AI भाषांतर सेवा [Co-op Translator](https://github.com/Azure/co-op-translator) चा वापर करून भाषांतरित करण्यात आला आहे. आम्ही अचूकतेसाठी प्रयत्नशील असलो तरी कृपया लक्षात ठेवा की स्वयंचलित भाषांतरांमध्ये त्रुटी किंवा अचूकतेचा अभाव असू शकतो. मूळ भाषेतील दस्तऐवज हा अधिकृत स्रोत मानला जावा. महत्त्वाच्या माहितीसाठी व्यावसायिक मानवी भाषांतराची शिफारस केली जाते. या भाषांतराचा वापर करून निर्माण होणाऱ्या कोणत्याही गैरसमज किंवा चुकीच्या अर्थासाठी आम्ही जबाबदार राहणार नाही.\n"
]
}
],
@ -1078,8 +1082,8 @@
"start_slideshow_at": "selected"
},
"coopTranslator": {
"original_hash": "914fc55f59efc7e17b8130d4033ac617",
"translation_date": "2025-08-29T06:47:46+00:00",
"original_hash": "d67e5b54ba20b507aa88d71aa3d042d8",
"translation_date": "2025-10-03T13:19:04+00:00",
"source_file": "lessons/3-NeuralNetworks/03-Perceptron/Perceptron.ipynb",
"language_code": "mr"
}

View File

@ -11,7 +11,7 @@
"source": [
"## Perceptron\n",
"\n",
"> Notebook ini adalah sebahagian daripada [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners). Lawati repositori untuk set lengkap bahan pembelajaran.\n",
"> Notebook ini adalah sebahagian daripada [Kurikulum AI untuk Pemula](http://github.com/microsoft/ai-for-beginners). Lawati repositori untuk set lengkap bahan pembelajaran.\n",
"\n",
"Seperti yang telah kita bincangkan, perceptron membolehkan anda menyelesaikan **masalah klasifikasi binari**, iaitu untuk mengklasifikasikan contoh input kepada dua kelas - kita boleh memanggilnya **positif** dan **negatif**.\n",
"\n",
@ -49,9 +49,9 @@
"source": [
"## Masalah Mainan\n",
"\n",
"Untuk memulakan, mari kita mulakan dengan masalah mainan, di mana kita mempunyai dua ciri input. Sebagai contoh, dalam bidang perubatan, kita mungkin ingin mengklasifikasikan tumor kepada jinak dan malignan, bergantung pada saiz dan usianya.\n",
"Sebagai permulaan, mari kita mulakan dengan masalah mainan, di mana kita mempunyai dua ciri input. Sebagai contoh, dalam bidang perubatan, kita mungkin ingin mengklasifikasikan tumor kepada jinak dan malignan, bergantung kepada saiz dan umurnya.\n",
"\n",
"Kita akan menjana set data klasifikasi rawak menggunakan fungsi `make_classification` daripada perpustakaan SciKit Learn:\n"
"Kita akan menghasilkan dataset klasifikasi rawak menggunakan fungsi `make_classification` daripada perpustakaan SciKit Learn:\n"
]
},
{
@ -95,7 +95,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Mari kita plot set data:\n"
"Mari kita plotkan dataset:\n"
]
},
{
@ -211,9 +211,9 @@
"$$E(\\mathbf{w}) = -\\sum_{n \\in \\mathcal{M}}\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}_{n}t_{n}$$\n",
" \n",
" * $t_{n} \\in \\{-1, +1\\}$ untuk sampel latihan negatif dan positif, masing-masing\n",
" * $\\mathcal{M}$ - satu set contoh yang diklasifikasikan secara salah\n",
" * $\\mathcal{M}$ - satu set contoh yang diklasifikasikan dengan salah\n",
" \n",
"Kita akan menggunakan proses **penurunan kecerunan**. Bermula dengan berat rawak awal $\\mathbf{w}^{(0)}$, kita akan melaraskan berat pada setiap langkah latihan menggunakan kecerunan $E$:\n",
"Kita akan menggunakan proses **penurunan kecerunan**. Bermula dengan berat rawak awal $\\mathbf{w}^{(0)}$, kita akan menyesuaikan berat pada setiap langkah latihan menggunakan kecerunan $E$:\n",
"\n",
"$$\\mathbf{w}^{\\tau + 1}=\\mathbf{w}^{\\tau} - \\eta \\nabla E(\\mathbf{w}) = \\mathbf{w}^{\\tau} + \\eta\\sum_{n \\in \\mathcal{M}}\\mathbf{x}_{n} t_{n}$$\n",
"\n",
@ -271,7 +271,9 @@
{
"cell_type": "markdown",
"metadata": {},
"source": []
"source": [
"Sekarang mari kita jalankan latihan pada set data kita:\n"
]
},
{
"cell_type": "code",
@ -309,9 +311,9 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Seperti yang anda lihat, ketepatan awal adalah sekitar 50%, tetapi ia dengan cepat meningkat ke nilai yang lebih tinggi menghampiri 90%.\n",
"Seperti yang anda lihat, ketepatan awal adalah sekitar 50%, tetapi ia cepat meningkat ke nilai yang lebih tinggi hampir 90%.\n",
"\n",
"Mari kita visualisasikan bagaimana kelas-kelas dipisahkan. Fungsi klasifikasi kita kelihatan seperti $\\mathbf{w}^Tx$, dan ia lebih besar daripada 0 untuk satu kelas, dan kurang daripada 0 untuk kelas yang lain. Oleh itu, garis pemisahan kelas ditakrifkan oleh $\\mathbf{w}^Tx = 0$. Oleh kerana kita hanya mempunyai dua dimensi $x_0$ dan $x_1$, persamaan untuk garis tersebut adalah $w_0x_0+w_1x_1+w_2 = 0$ (ingat bahawa kita telah secara eksplisit mentakrifkan satu dimensi tambahan $x_2=1$). Mari kita plot garis ini:\n"
"Mari kita visualkan bagaimana kelas-kelas dipisahkan. Fungsi klasifikasi kita kelihatan seperti $\\mathbf{w}^Tx$, dan ia lebih besar daripada 0 untuk satu kelas, dan kurang daripada 0 untuk kelas yang lain. Oleh itu, garis pemisahan kelas ditakrifkan oleh $\\mathbf{w}^Tx = 0$. Oleh kerana kita hanya mempunyai dua dimensi $x_0$ dan $x_1$, persamaan untuk garis tersebut adalah $w_0x_0+w_1x_1+w_2 = 0$ (ingat bahawa kita telah secara eksplisit mentakrifkan satu dimensi tambahan $x_2=1$). Mari kita plot garis ini:\n"
]
},
{
@ -379,7 +381,7 @@
"source": [
"## Menilai pada Dataset Ujian\n",
"\n",
"Pada permulaan, kami telah memisahkan beberapa data untuk dataset ujian. Mari kita lihat sejauh mana ketepatan pengklasifikasi kami pada dataset ujian ini. Untuk melakukan ini, kami juga mengembangkan dataset ujian dengan dimensi tambahan, mendarab dengan matriks berat, dan memastikan bahawa nilai yang diperoleh mempunyai tanda yang sama seperti label (+1 atau -1). Kemudian, kami menjumlahkan semua nilai boolean dan membahagikannya dengan panjang sampel ujian, untuk mendapatkan ketepatan:\n"
"Pada permulaan, kami telah memisahkan sebahagian data untuk dataset ujian. Mari kita lihat sejauh mana ketepatan pengklasifikasi kita pada dataset ujian ini. Untuk melakukan ini, kita juga mengembangkan dataset ujian dengan satu dimensi tambahan, menggandakan dengan matriks berat, dan memastikan nilai yang diperoleh mempunyai tanda yang sama seperti label (+1 atau -1). Kemudian, kita jumlahkan semua nilai boolean dan bahagikan dengan panjang sampel ujian, untuk mendapatkan ketepatan:\n"
]
},
{
@ -420,7 +422,7 @@
"source": [
"## Memerhati proses latihan\n",
"\n",
"Kita telah melihat sebelum ini bagaimana ketepatan berkurang semasa latihan. Adalah menarik untuk melihat bagaimana garis pemisah berubah semasa proses latihan. Kod di bawah akan memvisualisasikan semuanya dalam satu graf, dan anda sepatutnya boleh menggerakkan peluncur untuk \"mengembara masa\" melalui proses latihan.\n"
"Kita telah melihat sebelum ini bagaimana ketepatan menurun semasa latihan. Ia akan menarik untuk melihat bagaimana garis pemisahan berubah semasa latihan. Kod di bawah akan memvisualkan segalanya dalam satu graf, dan anda sepatutnya boleh menggerakkan slider untuk \"mengembara masa\" melalui proses latihan.\n"
]
},
{
@ -527,9 +529,9 @@
"source": [
"## Keterbatasan Perceptron\n",
"\n",
"Seperti yang anda lihat di atas, perceptron adalah **pengelas linear**. Ia dapat membezakan antara dua kelas dengan baik jika mereka **boleh dipisahkan secara linear**, iaitu boleh dipisahkan oleh garis lurus. Jika tidak, proses latihan perceptron tidak akan mencapai kesimpulan.\n",
"Seperti yang anda lihat di atas, perceptron adalah **pengelas linear**. Ia dapat membezakan antara dua kelas dengan baik jika mereka **boleh dipisahkan secara linear**, iaitu boleh dipisahkan oleh garis lurus. Jika tidak, proses latihan perceptron tidak akan mencapai penyelesaian.\n",
"\n",
"Contoh yang paling jelas bagi masalah yang tidak dapat diselesaikan oleh perceptron ialah masalah yang dikenali sebagai **masalah XOR**. Kita mahu perceptron kita belajar fungsi boolean XOR, yang mempunyai jadual kebenaran berikut:\n",
"Contoh yang paling jelas bagi masalah yang tidak dapat diselesaikan oleh perceptron ialah masalah yang dikenali sebagai **masalah XOR**. Kita mahu perceptron kita mempelajari fungsi boolean XOR, yang mempunyai jadual kebenaran berikut:\n",
"\n",
"| | 0 | 1 |\n",
"|---|---|---|\n",
@ -603,9 +605,9 @@
}
},
"source": [
"Seperti yang dapat dilihat dari graf di atas, ketepatan tidak pernah melebihi 75%, kerana mustahil untuk melukis garis lurus sedemikian rupa sehingga semua contoh yang mungkin dapat diselesaikan dengan betul.\n",
"Seperti yang dapat dilihat daripada graf di atas, ketepatan tidak pernah melebihi 75%, kerana mustahil untuk melukis garis lurus sedemikian rupa sehingga semua contoh yang mungkin dapat diselesaikan dengan betul.\n",
"\n",
"Masalah XOR adalah contoh klasik tentang keterbatasan perceptron, dan ia telah diketengahkan oleh Marvin Minsky dan Seymour Papert pada tahun 1969 dalam buku mereka [Perceptrons](https://en.wikipedia.org/wiki/Perceptrons_(book)). Pemerhatian ini telah membatasi penyelidikan dalam bidang rangkaian neural selama hampir 10 tahun, walaupun - dan kita akan melihat ini dalam bahagian seterusnya kursus kita - perceptron berlapis-lapis sebenarnya mampu menyelesaikan masalah seperti ini.\n",
"Masalah XOR adalah contoh klasik tentang batasan perceptron, dan ia telah ditunjukkan oleh Marvin Minsky dan Seymour Papert pada tahun 1969 dalam buku mereka [Perceptrons](https://en.wikipedia.org/wiki/Perceptrons_(book)). Pemerhatian ini telah mengehadkan penyelidikan dalam bidang rangkaian neural selama hampir 10 tahun, walaupun - dan kita akan melihat ini dalam bahagian seterusnya kursus kita - perceptron berlapis-lapis mampu menyelesaikan masalah seperti ini dengan sempurna.\n",
"\n",
"## Contoh Kompleks - MNIST\n",
"\n",
@ -642,7 +644,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Mari kita plot set data:\n"
"Mari kita plotkan dataset:\n"
]
},
{
@ -693,7 +695,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Oleh kerana perceptron adalah pengklasifikasi binari, kita akan menghadkan masalah kita kepada pengenalan hanya dua digit. Fungsi di bawah akan mengisi array sampel positif dan negatif dengan dua digit yang diberikan (dan juga akan menunjukkan sampel digit tersebut untuk kejelasan).\n"
"Oleh kerana perceptron adalah pengklasifikasi binari, kita akan mengehadkan masalah kita kepada mengenal pasti hanya dua digit. Fungsi di bawah akan mengisi array sampel positif dan negatif dengan dua digit yang diberikan (dan juga akan menunjukkan sampel digit tersebut untuk kejelasan).\n"
]
},
{
@ -733,7 +735,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Kami akan mula dengan cuba mengklasifikasikan antara 0 dan 1:\n"
"Kita akan mula dengan cuba mengklasifikasikan antara 0 dan 1:\n"
]
},
{
@ -831,9 +833,9 @@
"source": [
"Sila ambil perhatian bagaimana ketepatan meningkat hampir 100% dengan sangat cepat.\n",
"\n",
"Sila gerakkan peluncur ke kedudukan yang lebih ke hujung latihan, dan perhatikan matriks berat yang diplotkan di sebelah kiri. Matriks ini akan membantu anda memahami bagaimana perceptron sebenarnya berfungsi. Anda boleh melihat nilai berat tinggi di tengah medan, yang sepadan dengan piksel yang biasanya hadir untuk digit 1, dan nilai negatif rendah di sisi, di mana bahagian digit 0 berada. Jadi, jika digit yang diberikan kepada perceptron sebenarnya adalah 1, bahagian tengahnya akan didarabkan dengan nilai tinggi, menghasilkan keputusan positif. Sebaliknya, apabila perceptron memerhati digit 0, piksel yang sepadan akan didarabkan dengan nombor negatif.\n",
"Sila gerakkan slider ke kedudukan yang lebih ke hujung latihan, dan perhatikan matriks berat yang diplotkan di sebelah kiri. Matriks ini akan membantu anda memahami bagaimana perceptron sebenarnya berfungsi. Anda boleh melihat nilai berat yang tinggi di tengah medan, yang sepadan dengan piksel yang biasanya hadir untuk digit 1, dan nilai negatif rendah di sisi, di mana bahagian digit 0 berada. Jadi, jika digit yang diberikan kepada perceptron sebenarnya adalah 1, bahagian tengahnya akan didarabkan dengan nilai tinggi, menghasilkan keputusan positif. Sebaliknya, apabila perceptron memerhatikan digit 0, piksel yang sepadan akan didarabkan dengan nombor negatif.\n",
"\n",
"> Anda mungkin perasan bahawa jika kita memberikan perceptron digit 1 yang sedikit beralih secara mendatar, sehingga pikselnya menduduki tempat di mana terdapat bahagian menegak digit 0, kita mungkin mendapat keputusan yang salah. Oleh kerana sifat dataset MNIST kita adalah sedemikian rupa sehingga semua digit berpusat dan diposisikan dengan betul, dan perceptron bergantung pada ini untuk membezakan antara digit.\n",
"> Anda mungkin perasan bahawa jika kita memberikan perceptron digit 1 yang sedikit beralih secara mendatar, sehingga pikselnya berada di tempat di mana terdapat bahagian menegak digit 0, kita mungkin mendapat keputusan yang salah. Oleh kerana sifat dataset MNIST kita adalah sedemikian rupa sehingga semua digit berpusat dan diposisikan dengan betul, perceptron bergantung pada ini untuk membezakan antara digit.\n",
"\n",
"Sekarang mari kita cuba digit yang berbeza:\n"
]
@ -915,7 +917,7 @@
"\n",
"Untuk memahami mengapa ini berlaku, kita boleh cuba menggunakan [Analisis Komponen Utama](https://en.wikipedia.org/wiki/Principal_component_analysis) (PCA). Ia adalah teknik pembelajaran mesin yang digunakan untuk mengurangkan dimensi dataset input, dengan cara mendapatkan pemisahan terbaik antara kelas.\n",
"\n",
"Dalam kes kita, imej input mempunyai 784 piksel (ciri input), dan kita ingin menggunakan PCA untuk mengurangkan bilangan parameter kepada hanya 2, supaya kita boleh memplotnya pada graf. Dua parameter tersebut akan menjadi gabungan linear ciri asal, dan kita boleh melihat prosedur ini sebagai \"memutar\" ruang 784-dimensi asal kita dan memerhatikan proyeksinya ke ruang 2D, sehingga kita mendapat pandangan terbaik yang memisahkan kelas.\n"
"Dalam kes kita, imej input mempunyai 784 piksel (ciri input), dan kita ingin menggunakan PCA untuk mengurangkan bilangan parameter kepada hanya 2, supaya kita boleh memplotnya pada graf. Dua parameter tersebut akan menjadi gabungan linear ciri asal, dan kita boleh melihat prosedur ini sebagai \"memutar\" ruang 784-dimensi asal kita dan memerhatikan proyeksinya ke ruang 2D kita, sehingga kita mendapat pandangan terbaik yang memisahkan kelas.\n"
]
},
{
@ -1025,17 +1027,17 @@
}
},
"source": [
"Seperti yang anda lihat, 0 dan 1 boleh dipisahkan dengan jelas menggunakan garis lurus. Ini menunjukkan bahawa dalam ruang asal berdimensi 784, titik-titik yang mewakili digit juga boleh dipisahkan secara linear. Dalam kes 2 dan 5, kita tidak dapat mencari unjuran yang baik untuk memisahkan digit dengan jelas, dan oleh itu terdapat beberapa kes klasifikasi yang salah.\n",
"Seperti yang anda lihat, 0 dan 1 dapat dipisahkan dengan jelas menggunakan garis lurus. Ini menunjukkan bahawa dalam ruang asal berdimensi 784, titik-titik yang mewakili digit juga boleh dipisahkan secara linear. Dalam kes 2 dan 5, kita tidak dapat mencari unjuran yang baik untuk memisahkan digit dengan jelas, dan oleh itu terdapat beberapa kes klasifikasi yang salah.\n",
"\n",
"> Kemudian dalam kursus ini kita akan belajar cara mencipta pengklasifikasi tidak linear menggunakan Rangkaian Neural, dan bagaimana menangani masalah digit yang tidak sejajar dengan betul. Tidak lama lagi kita akan mencapai ketepatan lebih daripada 99% dalam klasifikasi digit MNIST, sambil mengklasifikasikan mereka ke dalam 10 kelas yang berbeza.\n",
"> Kemudian dalam kursus ini kita akan belajar bagaimana mencipta pengklasifikasi tidak linear menggunakan Rangkaian Neural, dan bagaimana menangani masalah digit yang tidak sejajar dengan betul. Tidak lama lagi kita akan mencapai ketepatan lebih daripada 99% dalam klasifikasi digit MNIST, sambil mengklasifikasikan mereka ke dalam 10 kelas yang berbeza.\n",
"\n",
"## Intipati\n",
"## Kesimpulan\n",
"\n",
" * Kita telah belajar tentang seni bina rangkaian neural yang paling mudah - perceptron satu lapisan.\n",
" * Kita telah melaksanakan perceptron \"secara manual\", menggunakan prosedur latihan mudah berdasarkan penurunan kecerunan.\n",
" * Walaupun mudah, perceptron satu lapisan boleh menyelesaikan masalah yang agak kompleks dalam pengenalan digit tulisan tangan.\n",
" * Walaupun mudah, perceptron satu lapisan dapat menyelesaikan masalah yang agak kompleks dalam pengenalan digit tulisan tangan.\n",
" * Perceptron satu lapisan adalah pengklasifikasi linear, dan oleh itu ia memberikan kuasa klasifikasi yang sama seperti regresi logistik.\n",
" * Dalam ruang sampel, perceptron boleh memisahkan dua kelas data input menggunakan hiperplan.\n"
" * Dalam ruang sampel, perceptron dapat memisahkan dua kelas data input menggunakan hiperplan.\n"
]
},
{
@ -1044,14 +1046,14 @@
"source": [
"## Kredit\n",
"\n",
"Notebook ini adalah sebahagian daripada [Kurikulum AI untuk Pemula](http://github.com/microsoft/ai-for-beginners), dan telah disediakan oleh [Dmitry Soshnikov](http://soshnikov.com). Ia diilhamkan oleh Bengkel Rangkaian Neural di Microsoft Research Cambridge. Beberapa kod dan bahan ilustrasi diambil daripada pembentangan oleh [Katja Hoffmann](https://www.microsoft.com/en-us/research/people/kahofman/), [Matthew Johnson](https://www.microsoft.com/en-us/research/people/matjoh/), dan [Ryoto Tomioka](https://www.microsoft.com/en-us/research/people/ryoto/), serta daripada repositori [NeuroWorkshop](http://github.com/shwars/NeuroWorkshop).\n"
"Notebook ini adalah sebahagian daripada [Kurikulum AI untuk Pemula](http://github.com/microsoft/ai-for-beginners), dan telah disediakan oleh [Dmitry Soshnikov](http://soshnikov.com). Ia diilhamkan oleh Bengkel Rangkaian Neural di Microsoft Research Cambridge. Sebahagian kod dan bahan ilustrasi diambil daripada pembentangan oleh [Katja Hoffmann](https://www.microsoft.com/en-us/research/people/kahofman/), [Matthew Johnson](https://www.microsoft.com/en-us/research/people/matjoh/) dan [Ryoto Tomioka](https://www.microsoft.com/en-us/research/people/ryoto/), serta daripada repositori [NeuroWorkshop](http://github.com/shwars/NeuroWorkshop).\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Penafian**: \nDokumen ini telah diterjemahkan menggunakan perkhidmatan terjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Walaupun kami berusaha untuk memastikan ketepatan, sila ambil perhatian bahawa terjemahan automatik mungkin mengandungi kesilapan atau ketidaktepatan. Dokumen asal dalam bahasa asalnya harus dianggap sebagai sumber yang berwibawa. Untuk maklumat penting, terjemahan manusia profesional adalah disyorkan. Kami tidak bertanggungjawab atas sebarang salah faham atau salah tafsir yang timbul daripada penggunaan terjemahan ini.\n"
"\n---\n\n**Penafian**: \nDokumen ini telah diterjemahkan menggunakan perkhidmatan terjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Walaupun kami berusaha untuk memastikan ketepatan, sila ambil perhatian bahawa terjemahan automatik mungkin mengandungi kesilapan atau ketidaktepatan. Dokumen asal dalam bahasa asalnya harus dianggap sebagai sumber yang berwibawa. Untuk maklumat yang kritikal, terjemahan manusia profesional adalah disyorkan. Kami tidak bertanggungjawab atas sebarang salah faham atau salah tafsir yang timbul daripada penggunaan terjemahan ini.\n"
]
}
],
@ -1080,8 +1082,8 @@
"start_slideshow_at": "selected"
},
"coopTranslator": {
"original_hash": "914fc55f59efc7e17b8130d4033ac617",
"translation_date": "2025-08-29T14:59:57+00:00",
"original_hash": "d67e5b54ba20b507aa88d71aa3d042d8",
"translation_date": "2025-10-03T13:36:51+00:00",
"source_file": "lessons/3-NeuralNetworks/03-Perceptron/Perceptron.ipynb",
"language_code": "ms"
}

View File

@ -9,11 +9,11 @@
}
},
"source": [
"## ပာဆက်ထရွန်\n",
"## Perceptron\n",
"\n",
"> ဒီနော့ဘွတ်က [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners) ရှိ အစီအစဉ်တစ်ခုဖြစ်ပါတယ်။ လေ့လာရန် ပညာရေးဆိုင်ရာ အစုံအလင်ကို ရယူရန် repository ကို သွားရောက်ကြည့်ရှုပါ။\n",
"> ဒီ notebook ဟာ [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners) ရဲ့ အစိတ်အပိုင်းတစ်ခုဖြစ်ပါတယ်။ လေ့လာရန်အတွက် အပြည့်အစုံသော အကြောင်းအရာများကို repository မှာ သွားရောက်ကြည့်ရှုနိုင်ပါတယ်။\n",
"\n",
"ကျွန်တော်တို့ ဆွေးနွေးခဲ့သလိုပဲ၊ ပာဆက်ထရွန်က **binary classification problem** ကို ဖြေရှင်းနိုင်စေပါတယ်။ ဒါဟာ input နမူနာတွေကို အမျိုးအစားနှစ်မျိုး - **positive** နဲ့ **negative** အဖြစ် ခွဲခြားနိုင်စေပါတယ်။\n",
"ကျွန်တော်တို့ ဆွေးနွေးခဲ့သလိုပဲ၊ perceptron က **binary classification problem** ကို ဖြေရှင်းနိုင်စေပါတယ်။ ဒါဟာ input ตัวอย่างတွေကို အမျိုးအစားနှစ်မျိုး - **positive** နဲ့ **negative** အဖြစ် ခွဲခြားနိုင်စေပါတယ်။\n",
"\n",
"ပထမဆုံး၊ လိုအပ်တဲ့ library တွေကို import လုပ်ကြရအောင်။\n"
]
@ -47,11 +47,11 @@
}
},
"source": [
"## အရုပ်ဆန်တဲ့ ပြဿနာ\n",
"## အရုပ်ပြဿနာ\n",
"\n",
"စတင်ဖို့အတွက်၊ အရုပ်ဆန်တဲ့ ပြဿနာတစ်ခုနဲ့ စလိုက်ကြရအောင်၊ ဒါဟာ အထူးသဖြင့် အချက်အလက်နှစ်ခုသာ ပါဝင်တဲ့အခါဖြစ်ပါတယ်။ ဥပမာအားဖြင့်၊ ဆေးဘက်ဆိုင်ရာမှာ ကျွန်တော်တို့ဟာ အကျိုးသက်ရောက်မှုအပေါ် မူတည်ပြီး အကျိုးသက်ရောက်မှုမရှိတဲ့ အကျိုးသက်ရောက်မှုရှိတဲ့ အကျိုးသက်ရောက်မှုအမျိုးအစားများကို ခွဲခြားဖို့လိုတတ်ပါတယ်။\n",
"စတင်ရန်အတွက် အရုပ်ပြဿနာတစ်ခုဖြင့် စတင်ပါမည်၊ အဲဒီမှာ input feature နှစ်ခုရှိပါသည်။ ဥပမာအားဖြင့် ဆေးဘက်ဆိုင်ရာတွင် ကျောက်ကပ်ရောဂါများကို အဆိပ်မရှိသောနှင့် အဆိပ်ရှိသောအဖြစ် ခွဲခြားလိုပါက၊ ၎င်း၏ အရွယ်အစားနှင့် အသက်ပေါ်မူတည်၍ ခွဲခြားနိုင်ပါသည်။\n",
"\n",
"SciKit Learn စာကြည့်တိုက်ထဲက `make_classification` လုပ်ဆောင်ချက်ကို အသုံးပြုပြီး အမှန်တကယ် အမျိုးအစားခွဲခြားမှု ဒေတာစနစ်တစ်ခုကို ဖန်တီးသွားပါမယ်။\n"
"SciKit Learn library မှ `make_classification` function ကို အသုံးပြု၍ အမှတ်အသား random classification dataset ကို ဖန်တီးပါမည်။\n"
]
},
{
@ -94,7 +94,9 @@
{
"cell_type": "markdown",
"metadata": {},
"source": []
"source": [
"ဒေတာစနစ်ကိုလည်း ပုံဆွဲကြည့်ရအောင်။\n"
]
},
{
"cell_type": "code",
@ -152,11 +154,11 @@
"source": [
"## Perceptron\n",
"\n",
"Perceptron သည် binary classifier ဖြစ်သောကြောင့်၊ input vector $x$ တစ်ခုစီအတွက်၊ ကျွန်ုပ်တို့၏ perceptron ၏ output သည် class ပေါ်မူတည်၍ +1 သို့မဟုတ် -1 ဖြစ်မည်ဖြစ်သည်။ Output ကို အောက်ပါဖော်ပြထားသော ဆင်ခြင်ချက်ဖြင့်တွက်ချက်မည်ဖြစ်သည်-\n",
"Perceptron သည် binary classifier ဖြစ်သောကြောင့်၊ input vector $x$ တစ်ခုစီအတွက်၊ perceptron ၏ output သည် class ပေါ်မူတည်၍ +1 သို့မဟုတ် -1 ဖြစ်မည်။ Output ကို အောက်ပါနည်းဖြင့်တွက်ချက်မည်။\n",
"\n",
"$$y(\\mathbf{x}) = f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x})$$\n",
"\n",
"ဤတွင် $\\mathbf{w}$ သည် weight vector ဖြစ်ပြီး၊ $f$ သည် step activation function ဖြစ်သည်-\n",
"ဤနေရာတွင် $\\mathbf{w}$ သည် weight vector ဖြစ်ပြီး၊ $f$ သည် step activation function ဖြစ်သည်\n",
"$$\n",
"f(x) = \\begin{cases}\n",
" +1 & x \\geq 0 \\\\\n",
@ -164,7 +166,7 @@
" \\end{cases} \\\\\n",
"$$\n",
"\n",
"သို့သော်၊ အထွေထွေ linear model တစ်ခုတွင် bias ပါဝင်သင့်ပြီး၊ အထူးသဖြင့် $y$ ကို $y=f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}+\\mathbf{b})$ အဖြစ်တွက်ချက်သင့်သည်။ ကျွန်ုပ်တို့၏ model ကို ရိုးရှင်းစေရန်၊ input features တွင် အမြဲတမ်း 1 ဖြစ်နေသော dimension တစ်ခုထပ်ထည့်ခြင်းဖြင့် bias term ကို ဖယ်ရှားနိုင်သည်-\n"
"သို့သော်၊ generic linear model တစ်ခုတွင် bias ပါဝင်သင့်သည်၊ အတိအကျဆိုပါက $y$ ကို $y=f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}+\\mathbf{b})$ အဖြစ်တွက်ချက်သင့်သည်။ သို့သော်၊ မODEL ကိုရိုးရှင်းစေရန်၊ input features တွင် အမြဲတမ်း 1 ဖြစ်သော dimension တစ်ခုထပ်ထည့်ခြင်းဖြင့် bias term ကို ဖယ်ရှားနိုင်သည်\n"
]
},
{
@ -204,20 +206,20 @@
"source": [
"## လေ့ကျင့်မှု အယ်လဂိုရီသမ်\n",
"\n",
"Perceptron ကို လေ့ကျင့်ရန်အတွက် error ကို လျှော့ချနိုင်မည့် အလေးချိန်များ $\\mathbf{w}$ ကို ရှာဖွေဖို့ လိုအပ်ပါတယ်။ Error ကို **perceptron criteria** အသုံးပြု၍ သတ်မှတ်ထားပါတယ်။\n",
"Perceptron ကို လေ့ကျင့်ရန်အတွက် အမှားကို လျှော့ချနိုင်မည့် အလေးချိန်များ $\\mathbf{w}$ ကို ရှာဖွေဖို့ လိုအပ်ပါတယ်။ အမှားကို **perceptron criteria** ကို အသုံးပြု၍ သတ်မှတ်ထားပါတယ်-\n",
"\n",
"$$E(\\mathbf{w}) = -\\sum_{n \\in \\mathcal{M}}\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}_{n}t_{n}$$\n",
" \n",
" * $t_{n} \\in \\{-1, +1\\}$ သည် အနုတ်လက္ခဏာနှင့် အပေါင်းလက္ခဏာ training samples များအတွက် ဖြစ်သည်။\n",
" * $\\mathcal{M}$ - မှားယွင်းစွာ ခွဲခြားထားသော ဥပမာများ၏ စုစည်းမှု\n",
" * $t_{n} \\in \\{-1, +1\\}$ သည် အနုတ်လက္ခဏာနှင့် အပေါင်းလက္ခဏာ training samples အတွက် ဖြစ်သည်။\n",
" * $\\mathcal{M}$ - မှားယွင်းစွာ ခွဲခြားထားသော နမူနာများ၏ အစု\n",
"\n",
"**Gradient descent** လုပ်ငန်းစဉ်ကို အသုံးပြုသွားမည်ဖြစ်သည်။ စတင်အလေးချိန်များ $\\mathbf{w}^{(0)}$ ကို ကျပန်းရွေးချယ်ပြီး၊ training ၏ အဆင့်တိုင်းတွင် $E$ ၏ gradient ကို အသုံးပြု၍ အလေးချိန်များကို ပြင်ဆင်သွားမည်ဖြစ်သည်။\n",
"**gradient descent** လုပ်ငန်းစဉ်ကို အသုံးပြုမည်။ ပိုင်းင် အလေးချိန်များ $\\mathbf{w}^{(0)}$ ကို အမှတ်မထင် သတ်မှတ်ပြီး၊ လေ့ကျင့်မှု၏ တစ်ဆင့်ချင်းစီတွင် $E$ ၏ gradient ကို အသုံးပြု၍ အလေးချိန်များကို ပြင်ဆင်သွားမည်-\n",
"\n",
"$$\\mathbf{w}^{\\tau + 1}=\\mathbf{w}^{\\tau} - \\eta \\nabla E(\\mathbf{w}) = \\mathbf{w}^{\\tau} + \\eta\\sum_{n \\in \\mathcal{M}}\\mathbf{x}_{n} t_{n}$$\n",
"\n",
"ဤတွင် $\\eta$ သည် **learning rate** ဖြစ်ပြီး၊ $\\tau\\in\\mathbb{N}$ သည် iteration အရေအတွက် ဖြစ်သည်။\n",
"ဒီမှာ $\\eta$ သည် **learning rate** ဖြစ်ပြီး၊ $\\tau\\in\\mathbb{N}$ သည် iteration အရေအတွက် ဖြစ်သည်။\n",
"\n",
"Python ဖြင့် ဤအယ်လဂိုရီသမ်ကို သတ်မှတ်ကြည့်ရအောင်:\n"
"Python မှာ ဒီအယ်လဂိုရီသမ်ကို သတ်မှတ်ကြရအောင်-\n"
]
},
{
@ -269,7 +271,9 @@
{
"cell_type": "markdown",
"metadata": {},
"source": []
"source": [
"အခုတော့ ကျွန်တော်တို့ရဲ့ ဒေတာစနစ်ပေါ်မှာ လေ့ကျင့်မှုကို စတင်လုပ်ဆောင်ကြမယ်။\n"
]
},
{
"cell_type": "code",
@ -307,9 +311,9 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"စတင်မှာ တွေ့ရတဲ့ တိကျမှုဟာ ၅၀ ရာခိုင်နှုန်းလောက်ပဲရှိပေမယ့် အချိန်ကြာလာတာနဲ့အမျှ ၉၀ ရာခိုင်နှုန်းနီးပါးအထိ မြင့်တက်လာပါတယ်။\n",
"စတင်အတိအကျမှန်ကန်မှုသည် ၅၀% အနီးအနားတွင်ရှိနေသော်လည်း၊ အလျင်အမြန်တက်လာပြီး ၉၀% အနီးအနားရှိတန်ဖိုးများကိုရောက်ရှိသည်ကို သင်မြင်နိုင်ပါသည်။\n",
"\n",
"အတန်းတွေ ဘယ်လိုခွဲထားလဲဆိုတာကို ရှင်းပြကြည့်ရအောင်။ ကျွန်တော်တို့ရဲ့ အတန်းခွဲခြားမှုအလုပ်ဆောင်ပုံဟာ $\\mathbf{w}^Tx$ ဖြစ်ပြီး၊ တစ်ဖက်အတန်းအတွက် ထက်ကြီးနေပြီး၊ နောက်တစ်ဖက်အတန်းအတွက် ထက်နည်းနေပါတယ်။ ဒါကြောင့် အတန်းခွဲခြားမှုလိုင်းကို $\\mathbf{w}^Tx = 0$ နဲ့ သတ်မှတ်နိုင်ပါတယ်။ ကျွန်တော်တို့မှာ $x_0$ နဲ့ $x_1$ ဆိုတဲ့ နှစ်ခုတည်းသော အတိုင်းအတာတွေရှိတဲ့အတွက်၊ ဒီလိုင်းအတွက် ဆွေမျိုးဟာ $w_0x_0+w_1x_1+w_2 = 0$ ဖြစ်ပါတယ် (ကျွန်တော်တို့ $x_2=1$ ဆိုတဲ့ အပိုအတိုင်းအတာတစ်ခုကို ထည့်သွင်းသတ်မှတ်ထားတာကို သတိရပါ။) အခု ဒီလိုင်းကို ရှုထောင်ကြည့်ရအောင်။\n"
"အတန်းများကို ဘယ်လိုခွဲထားသည်ကို ရှင်းလင်းကြည့်ရှုကြမည်။ ကျွန်ုပ်တို့၏ အတန်းခွဲခြားမှုအလုပ်ဆောင်မှုသည် $\\mathbf{w}^Tx$ ဖြစ်ပြီး၊ တစ်ဖက်အတန်းအတွက် ထက်ကြီးကာ၊ အခြားအတန်းအတွက် ထက်ငယ်သည်။ ထို့ကြောင့် အတန်းခွဲခြားမှုလိုင်းကို $\\mathbf{w}^Tx = 0$ ဖြင့် သတ်မှတ်နိုင်သည်။ $x_0$ နှင့် $x_1$ ဆိုသည့် အတိုင်းအတာနှစ်ခုသာရှိသောကြောင့်၊ လိုင်းအတွက် သင်္ချာသက်မှတ်ချက်မှာ $w_0x_0+w_1x_1+w_2 = 0$ ဖြစ်သည် (ကျွန်ုပ်တို့သည် ထပ်တိုးအတိုင်းအတာတစ်ခု $x_2=1$ ကို ထင်ရှားစွာသတ်မှတ်ထားသည်ကို မှတ်ထားပါ။) အဆိုပါလိုင်းကို ရှုထောင်ကြည့်ရအောင်:\n"
]
},
{
@ -375,9 +379,9 @@
}
},
"source": [
"## စမ်းသပ်ဒေတာစုပေါင်းပေါ်တွင် အကဲဖြတ်ခြင်း\n",
"## စမ်းသပ်မှု ဒေတာစုပေါ်တွင် အကဲဖြတ်ခြင်း\n",
"\n",
"အစပိုင်းတွင်၊ ကျွန်ုပ်တို့သည် စမ်းသပ်ဒေတာစုပေါင်းအတွက် ဒေတာအချို့ကို ခွဲထုတ်ထားခဲ့ပါသည်။ ယခု စမ်းသပ်ဒေတာစုပေါင်းပေါ်တွင် ကျွန်ုပ်တို့၏ ခွဲခြားသူ၏ တိကျမှုကို ကြည့်ကြမည်။ ဒါကို ပြုလုပ်ရန်အတွက်၊ စမ်းသပ်ဒေတာစုပေါင်းကို ထပ်တိုးအတိုင်းအတာတစ်ခုဖြင့် တိုးချဲ့ပြီး၊ အလေးချိန် matrix ဖြင့် များပြားစေကာ၊ ရရှိသောတန်ဖိုးသည် အမှတ်အသား (+1 သို့မဟုတ် -1) နှင့် တူညီကြောင်း သေချာစေပါမည်။ ထို့နောက် boolean တန်ဖိုးအားလုံးကို ပေါင်းပြီး စမ်းသပ်နမူနာ၏ အရှည်ဖြင့် ခွဲခြားကာ တိကျမှုကို ရရှိစေရန် ပြုလုပ်ပါမည်-\n"
"အစပိုင်းတွင်၊ စမ်းသပ်မှု ဒေတာစုအတွက် အချို့သော ဒေတာများကို ခွဲထုတ်ထားခဲ့ပါသည်။ အခုတော့ ကျွန်ုပ်တို့၏ ခွဲခြားသူသည် စမ်းသပ်မှု ဒေတာစုပေါ်တွင် ဘယ်လောက်တိကျမှုရှိသည်ကို ကြည့်လိုက်ရအောင်။ ဒါကိုလုပ်ရန်၊ စမ်းသပ်မှု ဒေတာစုကို အပိုအတိုင်းအတာတစ်ခုဖြင့် တိုးချဲ့ပြီး၊ အလေးချိန် matrix ဖြင့် မကြိမ်မကြိမ်မြှောက်ပြီး၊ ရရှိသောတန်ဖိုးသည် label (+1 သို့မဟုတ် -1) နှင့် အတူတူသော အမှတ်အသားရှိကြောင်း သေချာစေပါသည်။ ထို့နောက် boolean တန်ဖိုးအားလုံးကို ပေါင်းပြီး စမ်းသပ်မှုနမူနာ၏ အရှည်ဖြင့် ခွဲခြားကာ တိကျမှုကို ရယူပါ:\n"
]
},
{
@ -418,7 +422,7 @@
"source": [
"## လေ့ကျင့်မှုလုပ်ငန်းစဉ်ကိုကြည့်ရှုခြင်း\n",
"\n",
"လေ့ကျင့်မှုအတွင်းမှာ တိကျမှုက ကျဆင်းသွားပုံကို ယခင်က ကြည့်ဖူးပြီးဖြစ်ပါတယ်။ လေ့ကျင့်မှုအတွင်းမှာ ခွဲခြားရေးလိုင်းက ဘယ်လိုပြောင်းလဲသွားတယ်ဆိုတာကိုလည်း ကြည့်နိုင်ရင် ကောင်းမယ်။ အောက်ပါကုဒ်က အားလုံးကို တစ်ခုပေါင်းပြီး ဂရပ်ဖ်တစ်ခုအနေနဲ့ ရှင်းလင်းပြသပေးမှာဖြစ်ပြီး၊ သင် slider ကို ရွှေ့ပြီး \"အချိန်ခရီးသွား\" လုပ်ကာ လေ့ကျင့်မှုလုပ်ငန်းစဉ်ကို ကြည့်ရှုနိုင်ပါမယ်။\n"
"လေ့ကျင့်မှုအတွင်းမှာ တိကျမှုက ကျဆင်းသွားပုံကို အရင်က ကြည့်ဖူးခဲ့ပါတယ်။ လေ့ကျင့်မှုအတွင်းမှာ ခွဲခြားရေးလိုင်းက ဘယ်လိုပြောင်းလဲသွားတယ်ဆိုတာကို ကြည့်ရှုနိုင်ရင် ကောင်းမယ်လို့ ထင်ပါတယ်။ အောက်မှာရှိတဲ့ code က အားလုံးကို တစ်ခုပေါင်းပြီး graph တစ်ခုမှာ ရှင်းလင်းပြသပေးမှာဖြစ်ပြီး slider ကို ရွှေ့ပြီး \"အချိန်ခရီး\" လုပ်ကာ လေ့ကျင့်မှုလုပ်ငန်းစဉ်ကို ကြည့်ရှုနိုင်ပါမယ်။\n"
]
},
{
@ -525,16 +529,16 @@
"source": [
"## Perceptron ၏ အကန့်အသတ်များ\n",
"\n",
"အထက်တွင် မြင်တွေ့ခဲ့သလို၊ perceptron သည် **linear classifier** တစ်ခုဖြစ်သည်။ ၎င်းသည် **linearly separable** ဖြစ်သောအခါ၊ အတန်းနှစ်ခုကို ရိုးရိုးတန်းတန်း သေချာစွာ ခွဲခြားနိုင်သည်။ အခြားသောအခါတွင်၊ perceptron ၏ လေ့ကျင့်မှုလုပ်ငန်းစဉ်သည် မသင့်တော်နိုင်ပါ။\n",
"အထက်တွင် ကြည့်ရှုခဲ့သလို၊ perceptron သည် **linear classifier** တစ်ခုဖြစ်သည်။ **linearly separable** ဖြစ်သောအခါ၊ အတန်းနှစ်ခုကို တိကျစွာ ခွဲခြားနိုင်သည်။ အတန်းများကို တိုင်းရိုင်းလိုင်းဖြင့် ခွဲခြား၍မရပါက၊ perceptron ၏ လေ့ကျင့်မှုလုပ်ငန်းစဉ်သည် မအောင်မြင်နိုင်ပါ။\n",
"\n",
"Perceptron များဖြင့် ဖြေရှင်း၍ မရနိုင်သော ပြဿနာတစ်ခုအနေဖြင့် အထင်ရှားဆုံး ဥပမာမှာ **XOR problem** ဟုခေါ်သော ပြဿနာဖြစ်သည်။ XOR boolean function ကို သင်ယူစေလိုပါက၊ ၎င်းတွင် အောက်ပါ အမှန်တရားဇယား (truth table) ရှိသည်-\n",
"Perceptron ဖြင့် ဖြေရှင်း၍မရနိုင်သော ပြဿနာတစ်ခု အထင်ရှားဆုံး ဥပမာမှာ **XOR problem** ဟုခေါ်သော ပြဿနာဖြစ်သည်။ XOR boolean function ကို perceptron သင်ယူစေလိုပါက၊ ၎င်း၏ truth table သည် အောက်ပါအတိုင်းဖြစ်သည်-\n",
"\n",
"| | 0 | 1 |\n",
"|---|---|---|\n",
"| 0 | 0 | 1 | \n",
"| 1 | 1 | 0 |\n",
"\n",
"အခုတော့ စမ်းကြည့်ကြရအောင်! အပေါင်း (positive) နှင့် အနုတ် (negative) လေ့ကျင့်မှုနမူနာများအားလုံးကို ကိုယ်တိုင်ဖြည့်စွက်ပြီး၊ အထက်တွင် သတ်မှတ်ထားသော train function ကို ခေါ်သုံးကြည့်မည်-\n"
"အဲဒါကို လုပ်ကြည့်ရအောင်! အပေါင်းအပေါက် training samples အားလုံးကို ကိုယ်တိုင်ဖြည့်ပြီး၊ အထက်တွင် သတ်မှတ်ထားသော train function ကို ခေါ်ကြည့်မည်:\n"
]
},
{
@ -601,21 +605,21 @@
}
},
"source": [
"အပေါ်ရှိဂရပ်မှကြည့်လျှင်၊ တိကျမှုသည် 75% အထက်မတက်နိုင်ပါ၊ အကြောင်းမှာ အားလုံးကိုမှန်ကန်စေရန် တိုက်ရိုက်လိုင်းတစ်ခုဆွဲရန် မဖြစ်နိုင်သောကြောင့်ဖြစ်သည်။\n",
"အပေါ်ရှိဂရပ်မှကြည့်လိုက်ပါက၊ တိကျမှုသည် ၇၅% အထက်မတက်နိုင်ပါ၊ အကြောင်းကတော့ အားလုံးကိုမှန်ကန်စွာဖြေရှင်းနိုင်ရန် တိုက်ရိုက်လိုင်းတစ်ခုကိုဆွဲရန် မဖြစ်နိုင်သောကြောင့်ဖြစ်သည်။\n",
"\n",
"XOR ပြဿနာသည် perceptron အကန့်အသတ်များ၏ ဂန္ထဝင်ဥပမာတစ်ခုဖြစ်ပြီး၊ ၎င်းကို Marvin Minsky နှင့် Seymour Papert က 1969 ခုနှစ်၌ ၎င်းတို့၏စာအုပ် [Perceptrons](https://en.wikipedia.org/wiki/Perceptrons_(book)) တွင် ဖော်ပြခဲ့သည်။ ဤအမြင်ကြောင့် နယူးရယ်နက်ဝက်များဆိုင်ရာ သုတေသနများကို ၁၀ နှစ်နီးပါး ကန့်သတ်ခဲ့သည်။ သို့သော် - ကျွန်ုပ်တို့၏သင်ခန်းစာ၏နောက်ပိုင်းအပိုင်းတွင် မြင်ရမည်ဖြစ်သည့်အတိုင်း - အလွှာများစွာပါဝင်သော perceptrons များသည် ဤပြဿနာများကို ဖြေရှင်းနိုင်စွမ်းရှိသည်။\n",
"XOR ပြဿနာသည် perceptron အကန့်အသတ်များ၏ ဂန္ထဝင်ဥပမာတစ်ခုဖြစ်ပြီး၊ ၎င်းကို Marvin Minsky နှင့် Seymour Papert က ၁၉၆၉ ခုနှစ်၌ ၎င်းတို့၏စာအုပ် [Perceptrons](https://en.wikipedia.org/wiki/Perceptrons_(book)) တွင် ဖော်ပြခဲ့သည်။ ဤအချက်အလက်သည် နယူးရယ်နက်ဝက်များဆိုင်ရာ သုတေသနကို ၁၀ နှစ်ခန့် အကန့်အသတ်ထားခဲ့သည်။ သို့သော် - ကျွန်ုပ်တို့၏သင်ခန်းစာ၏နောက်ပိုင်းအပိုင်းတွင် မြင်ရမည်ဖြစ်သည့်အတိုင်း - အလွှာများစွာပါဝင်သော perceptrons များသည် ဤပြဿနာများကို အလုံးစုံဖြေရှင်းနိုင်သည်။\n",
"\n",
"## ရှုပ်ထွေးသော ဥပမာ - MNIST\n",
"\n",
"Perceptron သည် XOR ပြဿနာကို မဖြေရှင်းနိုင်သော်လည်း၊ လက်ရေးအက္ခရာများကို မှတ်မိစေရန်ကဲ့သို့သော ရှုပ်ထွေးသော ပြဿနာများစွာကို ဖြေရှင်းနိုင်သည်။\n",
"Perceptron သည် XOR ပြဿနာကို မဖြေရှင်းနိုင်သော်လည်း၊ လက်ရေးအက္ခရာများကို မှတ်မိစေခြင်းကဲ့သို့သော ရှုပ်ထွေးသော ပြဿနာများစွာကို ဖြေရှင်းနိုင်သည်။\n",
"\n",
"Machine learning ကိုကျွမ်းကျင်ရန် အသုံးပြုလေ့ရှိသော dataset တစ်ခုကို [MNIST](https://en.wikipedia.org/wiki/MNIST_database) ဟုခေါ်သည်။ ၎င်းကို Modified National Institute of Standards and Technology မှ ဖန်တီးခဲ့ပြီး၊ 60000 လက်ရေးဂဏန်းများပါဝင်သော training set တစ်ခုကို ထုတ်ဝေခဲ့သည်။ ဤ training set သည် အင်စတီကျု၏ ကျောင်းသားများနှင့် ဝန်ထမ်း 250 ခန့်မှ စုဆောင်းထားသည်။ ထို့အပြင်၊ လူပုဂ္ဂိုလ်များကွဲပြားစွာမှ စုဆောင်းထားသော 10000 ဂဏန်းများပါဝင်သော test dataset တစ်ခုလည်းရှိသည်။\n",
"Machine Learning ကိုကျွမ်းကျင်ရန် အသုံးပြုလေ့ရှိသော dataset တစ်ခုမှာ [MNIST](https://en.wikipedia.org/wiki/MNIST_database) ဟုခေါ်သည်။ ၎င်းကို Modified National Institute of Standards and Technology မှ ဖန်တီးခဲ့ပြီး၊ 60000 လက်ရေးဂဏန်းများပါဝင်သော training set တစ်ခုကို ထုတ်ဝေခဲ့သည်။ ဤ training set ကို အင်စတီကျု၏ ကျောင်းသားနှင့် ဝန်ထမ်း 250 ခန့်မှ စုဆောင်းခဲ့သည်။ ထို့အပြင်၊ လူပုဂ္ဂိုလ်များကွဲပြားစွာမှ စုဆောင်းထားသော 10000 ဂဏန်းများပါဝင်သော test dataset တစ်ခုလည်းရှိသည်။\n",
"\n",
"ဂဏန်းများအားလုံးကို 28x28 pixels အရွယ်ရှိသော grayscale images များဖြင့် ကိုယ်စားပြုထားသည်။\n",
"ဂဏန်းအားလုံးကို 28x28 pixels အရွယ်ရှိသော grayscale ပုံများဖြင့် ကိုယ်စားပြုထားသည်။\n",
"\n",
"> MNIST Dataset သည် [Kaggle](https://www.kaggle.com/c/digit-recognizer) တွင် training ပြိုင်ပွဲအဖြစ် ရရှိနိုင်ပါသည်။ Kaggle သည် machine learning ပြိုင်ပွဲများနှင့် ပြိုင်ဆိုင်မှုများကို လက်ခံသော site တစ်ခုဖြစ်သည်။ MNIST ဂဏန်းများကို အတိအကျခွဲခြားနိုင်ရန် သင်လေ့လာပြီးပါက၊ သင့်ဖြေရှင်းချက်ကို Kaggle တွင် တင်သွင်းကာ အခြားပါဝင်သူများနှင့် နှိုင်းယှဉ်၍ အဆင့်သတ်မှတ်မှုကို ကြည့်နိုင်ပါသည်။\n",
"> MNIST Dataset သည် [Kaggle](https://www.kaggle.com/c/digit-recognizer) တွင် training ပြိုင်ပွဲအဖြစ်ရရှိနိုင်ပြီး၊ machine learning ပြိုင်ပွဲများနှင့် ပြိုင်ဆိုင်မှုများကို ဖော်ပြသည့် site တစ်ခုဖြစ်သည်။ MNIST ဂဏန်းများကို ခွဲခြားနိုင်ရန် သင်လေ့လာပြီးပါက၊ သင့်ဖြေရှင်းချက်ကို Kaggle တွင် တင်သွင်းပြီး အခြားပါဝင်သူများနှင့် ဘယ်လိုအဆင့်သတ်မှတ်ထားသည်ကို ကြည့်နိုင်သည်။\n",
"\n",
"ကျွန်ုပ်တို့ MNIST dataset ကို load လုပ်ခြင်းဖြင့် စတင်ပါမည်:\n"
"ကျွန်ုပ်တို့ MNIST dataset ကို load လုပ်ခြင်းဖြင့် စတင်မည်။\n"
]
},
{
@ -640,7 +644,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"အခုတော့ ဒေတာစနစ်ကို ပုံဆွဲကြမယ်။\n"
"အခုတော့ ဒေတာစနစ်ကို ပုံဖော်ကြမယ်။\n"
]
},
{
@ -691,7 +695,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Perceptron သည် binary classifier ဖြစ်သောကြောင့်၊ ကျွန်ုပ်တို့၏ပြဿနာကို နံပါတ်နှစ်ခုသာ အသိအမှတ်ပြုနိုင်ရန် ကန့်သတ်မည်။ အောက်ပါ function သည် ပေးထားသော နံပါတ်နှစ်ခုဖြင့် အပေါင်းနှင့် အနုတ် sample array များကို ဖြည့်စွက်မည် (နှင့် ထို့နောက် အကြောင်းအရာရှင်းလင်းစေရန် အဆိုပါ နံပါတ် sample များကိုလည်း ပြသမည်)။\n"
"အကြောင်းမူတည်၍ perceptron သည် binary classifier ဖြစ်သောကြောင့်၊ ကျွန်ုပ်တို့၏ပြဿနာကို သာမန်နှစ်လုံးသောဂဏန်းများကိုသာ အသိအမှတ်ပြုနိုင်ရန် ကန့်သတ်မည်ဖြစ်သည်။ အောက်ပါ function သည် ပေးထားသောဂဏန်းနှစ်လုံးဖြင့် အပေါင်းအပြား sample array များကို ဖြည့်စွက်ပေးမည် (နှင့် ထိုဂဏန်းများ၏ sample များကို ရှင်းလင်းစွာ ပြသပေးမည်)။\n"
]
},
{
@ -730,7 +734,9 @@
{
"cell_type": "markdown",
"metadata": {},
"source": []
"source": [
"ကျွန်ုပ်တို့ နှင့် ၁ အကြား ခွဲခြားရန် ကြိုးစားမည်။\n"
]
},
{
"cell_type": "code",
@ -825,11 +831,13 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"ကျေးဇူးပြု၍ သင့်ရဲ့ training အဆင့်အဆုံးပိုင်းအနီးတစ်နေရာတွင် slider ကိုရွှေ့ပါ၊ ပြီးနောက် အလေးချိန် matrix ကို ဘယ်ဘက်တွင် ဖော်ပြထားသော ပုံစံအတိုင်း ကြည့်ရှုပါ။ ဒီ matrix က perceptron ဘယ်လိုအလုပ်လုပ်တယ်ဆိုတာကို နားလည်စေမှာဖြစ်ပါတယ်။ သင်မြင်နိုင်မှာကတော့ အလယ်ပိုင်းမှာ အလေးချိန်တန်ဖိုးမြင့်နေပြီး၊ ဒါဟာ သာမန်အားဖြင့် digit 1 အတွက်ရှိနေတတ်တဲ့ pixels တွေကို ကိုယ်စားပြုတာဖြစ်ပါတယ်။ အနားဘက်တွေမှာတော့ အနည်းတန်ဖိုး (အနုတ်တန်ဖိုး) တွေရှိနေပြီး၊ ဒါဟာ digit 0 ရဲ့ အစိတ်အပိုင်းတွေကို ကိုယ်စားပြုတာဖြစ်ပါတယ်။ ဒါကြောင့် perceptron ကို တင်ပြထားတဲ့ digit က တကယ်ပဲ 1 ဖြစ်နေခဲ့ရင်၊ အလယ်ပိုင်း pixels တွေဟာ အလေးချိန်မြင့်တန်ဖိုးတွေနဲ့ များပြားစွာမြှောက်ပေးပြီး အပေါင်းရလဒ်အနေဖြင့် အပေါင်းတန်ဖိုး (positive result) ထွက်လာမှာဖြစ်ပါတယ်။ အပြောင်းအလဲအနေနဲ့၊ perceptron က digit 0 ကိုကြည့်ရှုတဲ့အခါမှာတော့၊ ဆက်စပ် pixels တွေဟာ အနုတ်တန်ဖိုးတွေနဲ့ မြှောက်ပေးပြီး အနုတ်ရလဒ် (negative result) ထွက်လာမှာဖြစ်ပါတယ်။\n",
"ကျေးဇူးပြု၍ သတိပြုပါ၊ တိကျမှုသည် အလွန်မြန်စွာ ၁၀၀% အနီးအနားသို့ တက်လာသည်။\n",
"\n",
"> သင်သတိထားမိနိုင်ပါတယ်၊ perceptron ကို digit 1 တစ်ခု slightly horizontally shift လုပ်ပြီး ပေးလိုက်ရင်၊ အဲ့ဒီ digit ရဲ့ pixels တွေဟာ digit 0 ရဲ့ vertical အပိုင်းတွေရှိနေတဲ့နေရာကို ရောက်သွားနိုင်ပါတယ်။ ဒီလိုဖြစ်ရင်တော့ မမှန်ကန်တဲ့ရလဒ်ကို ရနိုင်ပါတယ်။ အဓိကအကြောင်းအရင်းက MNIST dataset ရဲ့ သဘာဝအရ၊ digits တွေဟာ အလယ်မှာတိတိစီပြီး position မှန်မှန်နဲ့ရှိနေတဲ့အတွက်ဖြစ်ပါတယ်။ perceptron ကလည်း ဒီအချက်ကို အားထားပြီး digits တွေကို ခွဲခြားနိုင်ပါတယ်။\n",
"ကျေးဇူးပြု၍ slider ကို သင်ကြားမှု၏ နောက်ဆုံးပိုင်းအနီးတစ်နေရာသို့ ရွှေ့ပြီး ဘယ်ဘက်တွင် ဖော်ပြထားသော weight matrix ကို ကြည့်ရှုပါ။ ဤ matrix သည် perceptron အကောင်အထည်ဖော်ပုံကို နားလည်ရန် ကူညီပေးမည်ဖြစ်သည်။ သင်သည် အလယ်ပိုင်းတွင် digit 1 အတွက် မကြာခဏတွေ့ရသော pixels ကို ကိုယ်စားပြုသော အမြင့်သော weight အတန်အတင်းများကို မြင်နိုင်ပြီး၊ 0 digit ၏ အပိုင်းများရှိသော ဘေးဘက်တွင် အနိမ့်သော အနုတ်တန်ဖိုးများကို တွေ့နိုင်ပါသည်။ ထို့ကြောင့် perceptron သို့ တင်ပြထားသော digit သည် တကယ်ပင် 1 ဖြစ်ပါက၊ ၎င်း၏ အလယ်ပိုင်းသည် အမြင့်တန်ဖိုးများဖြင့် များစွာမြှောက်ပေးပြီး အပေါင်းရလဒ်ကို ထုတ်ပေးမည်ဖြစ်သည်။ အတူတူပင်၊ perceptron သည် 0 ကို တွေ့ရှိသောအခါ၊ သက်ဆိုင် pixel များကို အနုတ်တန်ဖိုးများဖြင့် မြှောက်ပေးမည်ဖြစ်သည်။\n",
"\n",
"အခုတော့ အခြားသော digits တွေကို စမ်းကြည့်ကြရအောင်:\n"
"> သင်သည် perceptron ကို digit 1 ကို အနည်းငယ် အလျားလိုက်ရွှေ့ထားသောအခါ၊ ၎င်း၏ pixels များသည် 0 ၏ လျှောက်လမ်းလိုက် အပိုင်းများရှိသောနေရာကို ရောက်ရှိသည့်အခါ၊ မမှန်သောရလဒ်ကို ရရှိနိုင်သည်ကို သတိထားမိနိုင်ပါသည်။ ကျွန်ုပ်တို့၏ MNIST dataset ၏ သဘာဝသည် digit များအားလုံးကို အလယ်တွင်ထားပြီး သင့်တော်စွာ တည်နေရာချထားသောကြောင့်၊ perceptron သည် ဤအချက်ကို အခြေခံ၍ digit များကို ခွဲခြားသည်။\n",
"\n",
"အခုတော့ digit များကို ကွဲပြားစွာ စမ်းကြည့်ရအောင်: \n"
]
},
{
@ -905,11 +913,11 @@
"source": [
"## ဆွေးနွေးချက်\n",
"\n",
"တစ်ခုခုကြောင့် 2 နဲ့ 5 ကို အလွယ်တကူ ခွဲခြားဖို့ မဖြစ်နိုင်သလိုပဲ။ သို့သော် ကျွန်တော်တို့ အတိအကျမှန်ကန်မှု (85% အထက်) ရရှိနေတဲ့အချိန်မှာတောင် perceptron က တစ်ချိန်မှာ သင်ယူတာ ရပ်သွားတာကို ရှင်းရှင်းလင်းလင်း မြင်နိုင်ပါတယ်။\n",
"တစ်ခုခုကြောင့် 2 နဲ့ 5 ကို အလွယ်တကူ ခွဲခြားနိုင်ခြင်း မရှိပါဘူး။ Accuracy အနေနဲ့ 85% ကျော်ရရှိနေတဲ့အချိန်မှာတောင် Perceptron က တစ်ချိန်မှာ သင်ယူတာရပ်သွားတာကို ရှင်းရှင်းလင်းလင်း မြင်နိုင်ပါတယ်။\n",
"\n",
"ဒါဘာကြောင့်ဖြစ်တာလဲဆိုတာကို နားလည်ဖို့ [Principal Component Analysis](https://en.wikipedia.org/wiki/Principal_component_analysis) (PCA) ကို အသုံးပြုကြည့်နိုင်ပါတယ်။ ဒါဟာ input dataset ရဲ့ dimension ကို လျှော့ချဖို့ အသုံးပြုတဲ့ machine learning နည်းလမ်းတစ်ခုဖြစ်ပြီး၊ class တွေကို အကောင်းဆုံး ခွဲခြားနိုင်ဖို့ ရည်ရွယ်ပါတယ်။\n",
"ဒါကို နားလည်ဖို့ [Principal Component Analysis](https://en.wikipedia.org/wiki/Principal_component_analysis) (PCA) ကို အသုံးပြုကြည့်နိုင်ပါတယ်။ PCA က input dataset ရဲ့ dimensionality ကို လျှော့ချပြီး class တွေကို အကောင်းဆုံး ခွဲခြားနိုင်အောင် လုပ်ပေးတဲ့ machine learning နည်းလမ်းတစ်ခုပါ။\n",
"\n",
"ကျွန်တော်တို့ရဲ့ အခန်းကဏ္ဍမှာတော့ input image တစ်ခုမှာ 784 pixels (input features) ရှိပြီး၊ parameter အရေအတွက်ကို 2 ခုသာ လျှော့ချဖို့ PCA ကို အသုံးပြုချင်ပါတယ်။ ဒါက graph ပေါ်မှာ plot လုပ်နိုင်ဖို့အတွက်ပါ။ အဲဒီ parameter 2 ခုဟာ original features တွေရဲ့ linear combination ဖြစ်ပြီး၊ ဒီလုပ်ငန်းစဉ်ကို 784-dimensional space ကို \"လှည့်\"ပြီး 2D-space ပေါ်မှာ projection ကို ကြည့်ရှုတာအဖြစ် မြင်နိုင်ပါတယ်။ အထိရောက်ဆုံး class တွေကို ခွဲခြားနိုင်တဲ့ view ကို ရရှိတဲ့အထိ လုပ်ဆောင်တာဖြစ်ပါတယ်။\n"
"ဒီအခါမှာတော့ input image တစ်ခုမှာ 784 pixels (input features) ရှိပြီး၊ parameter အရေအတွက်ကို 2 ခုအထိ လျှော့ချဖို့ PCA ကို အသုံးပြုချင်ပါတယ်။ ဒီ parameter 2 ခုဟာ original features တွေကို linear combination အနေနဲ့ ရရှိမှာဖြစ်ပြီး၊ ဒီလုပ်ငန်းစဉ်ကို 784-dimensional space ကို \"လှည့်\"ပြီး 2D-space မှာ projection ကို ကြည့်ရှုတာအဖြစ် သတ်မှတ်နိုင်ပါတယ်။ အကောင်းဆုံး class တွေကို ခွဲခြားနိုင်တဲ့ view ကို ရရှိတဲ့အထိ ဒီလုပ်ငန်းစဉ်ကို ဆက်လုပ်ရမှာဖြစ်ပါတယ်။\n"
]
},
{
@ -1019,17 +1027,17 @@
}
},
"source": [
"0 နှင့် 1 ကို တိုက်ရိုက်လိုင်းတစ်ခုဖြင့် အလွယ်တကူ ခွဲခြားနိုင်သည်ကို တွေ့ရသည်။ ဒါကဆိုရင် မူလ 784-διάσταနယ်ပယ်အတွင်းမှာလည်း ဂဏန်းများကို ကိုယ်စားပြုသော အမှတ်များသည် လိုင်းနားဖြင့် ခွဲခြားနိုင်ကြောင်း ပြသနေသည်။ 2 နှင့် 5 အတွက်တော့ ဂဏန်းများကို အလွယ်တကူ ခွဲခြားနိုင်မည့် projection ကို ရှာမတွေ့နိုင်သဖြင့် မှားယွင်းသော ခွဲခြားမှုများ ဖြစ်ပေါ်နိုင်သည်။\n",
"0 နှင့် 1 ကို တိုက်ရိုက်လိုင်းတစ်ခုဖြင့် အလွယ်တကူ ခွဲခြားနိုင်သည်ကို သင်မြင်နိုင်ပါသည်။ ဤသည်မှာ မူရင်း 784-အတိုင်းအတာရှိ အချိုးအစားအတွင်းတွင် ဂဏန်းများနှင့် ဆက်စပ်နေသော အမှတ်များကိုလည်း တိုက်ရိုက်ခွဲခြားနိုင်ကြောင်း ပြသသည်။ 2 နှင့် 5 အတွက်တော့ ဂဏန်းများကို အလွယ်တကူ ခွဲခြားနိုင်မည့် ကောင်းမွန်သော ပရိုဂျက်ရှင်းကို ရှာဖွေမရနိုင်ပါ၊ ထို့ကြောင့် မှားယွင်းသော ခွဲခြားမှုအချို့ ဖြစ်ပေါ်နိုင်ပါသည်။\n",
"\n",
"> ဒီသင်တန်းမှာ နောက်ပိုင်းတွင် Neural Networks ကို အသုံးပြု၍ non-linear classifiers များကို ဘယ်လိုဖန်တီးရမည်ဆိုတာကို သင်ယူမည်ဖြစ်ပြီး၊ ဂဏန်းများ alignment မမှန်ကန်မှုကို ဘယ်လိုဖြေရှင်းရမည်ဆိုတာကိုလည်း လေ့လာမည်ဖြစ်သည်။ မကြာမီမှာပဲ MNIST digit classification တွင် 99% ကျော်သော တိကျမှုကို ရောက်ရှိမည်ဖြစ်ပြီး၊ ဂဏန်း 10 မျိုးကို ခွဲခြားနိုင်မည်ဖြစ်သည်။\n",
"> ဒီသင်တန်းမှာ နောက်ပိုင်းမှာတော့ Neural Networks ကို အသုံးပြုပြီး တိုက်ရိုက်မဟုတ်သော ခွဲခြားမှုလုပ်ဆောင်နည်းများကို သင်ယူမည်ဖြစ်ပြီး၊ ဂဏန်းများ မမှန်ကန်စွာ တည်နေရာချထားမှုကို မည်သို့ ကိုင်တွယ်ရမည်ကိုလည်း လေ့လာမည်ဖြစ်သည်။ မကြာမီအချိန်အတွင်းမှာပင် MNIST ဂဏန်းခွဲခြားမှုတွင် 99% ကျော်သော တိကျမှုရလဒ်ကို ရောက်ရှိမည်ဖြစ်ပြီး၊ ဂဏန်းများကို 10 မျိုးခွဲခြားနိုင်မည်ဖြစ်သည်။\n",
"\n",
"## အဓိကအချက်များ\n",
"\n",
" * အလွယ်ဆုံးသော neural network architecture - one-layer perceptron အကြောင်းကို သင်ယူခဲ့ပါသည်။\n",
" * gradient descent အခြေခံထားသော လွယ်ကူသော လေ့ကျင့်မှုနည်းလမ်းကို အသုံးပြု၍ perceptron ကို \"ကိုယ်တိုင်\" လက်တွေ့လုပ်ဆောင်ခဲ့ပါသည်။\n",
" * ရိုးရှင်းမှုရှိသော်လည်း၊ one-layered perceptron သည် လက်ရေးဂဏန်းများကို အသိအမှတ်ပြုနိုင်သော အတော်လေးရှုပ်ထွေးသော ပြဿနာများကို ဖြေရှင်းနိုင်သည်။\n",
" * One-layered perceptron သည် linear classifier ဖြစ်ပြီး၊ logistic regression နှင့် တူညီသော ခွဲခြားနိုင်စွမ်းကို ပေးစွမ်းနိုင်သည်။\n",
" * Sample space အတွင်းတွင်၊ perceptron သည် input data နှစ်မျိုးကို hyperplane အသုံးပြု၍ ခွဲခြားနိုင်သည်။\n"
" * အလွယ်ဆုံးသော neural network ဖွဲ့စည်းပုံ - one-layer perceptron ကို သင်ယူခဲ့ပါသည်။\n",
" * gradient descent ကို အခြေခံထားသော ရိုးရှင်းသော လေ့ကျင့်မှုနည်းလမ်းကို အသုံးပြု၍ perceptron ကို \"ကိုယ်တိုင်\" အကောင်အထည်ဖော်ခဲ့ပါသည်။\n",
" * ရိုးရှင်းမှုရှိသော်လည်း၊ one-layered perceptron သည် လက်ရေးဂဏန်းများကို အသိအမှတ်ပြုနိုင်သော အတော်လေးရှုပ်ထွေးသော ပြဿနာများကို ဖြေရှင်းနိုင်ပါသည်။\n",
" * one-layered perceptron သည် linear classifier ဖြစ်ပြီး၊ ထို့ကြောင့် logistic regression နှင့် တူညီသော ခွဲခြားမှုစွမ်းရည်ကိုပေးစွမ်းနိုင်ပါသည်။\n",
" * sample space အတွင်းတွင်၊ perceptron သည် input data ၏ အတန်းနှစ်ခုကို hyperplane အသုံးပြု၍ ခွဲခြားနိုင်ပါသည်။\n"
]
},
{
@ -1038,14 +1046,14 @@
"source": [
"## ခရက်ဒစ်များ\n",
"\n",
"ဒီနိုတ်ဘွတ်ခ်ကို [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners) ၏ အစိတ်အပိုင်းတစ်ခုအဖြစ် ဖန်တီးထားပြီး [Dmitry Soshnikov](http://soshnikov.com) မှ ပြင်ဆင်ထားပါသည်။ ၎င်းသည် Microsoft Research Cambridge ၏ Neural Network Workshop မှ အကြောင်းရင်းဖြင့် အားဖြည့်ထားခြင်းဖြစ်သည်။ အချို့သော ကုဒ်များနှင့် ရှင်းလင်းမှုအတွက် ပစ္စည်းများကို [Katja Hoffmann](https://www.microsoft.com/en-us/research/people/kahofman/), [Matthew Johnson](https://www.microsoft.com/en-us/research/people/matjoh/) နှင့် [Ryoto Tomioka](https://www.microsoft.com/en-us/research/people/ryoto/) ၏ တင်ဆက်မှုများမှ ယူဆောင်ထားပြီး [NeuroWorkshop](http://github.com/shwars/NeuroWorkshop) repository မှလည်း အချို့သော အချက်အလက်များကို အသုံးပြုထားပါသည်။\n"
"ဒီနိုတ်ဘွတ်ခ်ကို [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners) ရဲ့ အစိတ်အပိုင်းတစ်ခုအဖြစ် ပြုလုပ်ထားပြီး [Dmitry Soshnikov](http://soshnikov.com) က ပြင်ဆင်ထားပါတယ်။ Microsoft Research Cambridge ရဲ့ Neural Network Workshop မှ အကြောင်းအရာများကို အခြေခံထားပြီး ရေးသားထားတာဖြစ်ပါတယ်။ အချို့သော ကုဒ်များနှင့် ရှင်းလင်းဖော်ပြချက်များကို [Katja Hoffmann](https://www.microsoft.com/en-us/research/people/kahofman/), [Matthew Johnson](https://www.microsoft.com/en-us/research/people/matjoh/) နှင့် [Ryoto Tomioka](https://www.microsoft.com/en-us/research/people/ryoto/) တို့ရဲ့ ဖော်ပြချက်များမှယူထားပြီး [NeuroWorkshop](http://github.com/shwars/NeuroWorkshop) repository မှလည်း အချို့သောအရာများကို အသုံးပြုထားပါတယ်။\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**အကြောင်းကြားချက်**: \nဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှုအတွက် ကြိုးစားနေသော်လည်း အလိုအလျောက် ဘာသာပြန်ခြင်းတွင် အမှားများ သို့မဟုတ် မတိကျမှုများ ပါဝင်နိုင်သည်ကို သတိပြုပါ။ မူရင်းဘာသာစကားဖြင့် ရေးသားထားသော စာရွက်စာတမ်းကို အာဏာတရ အရင်းအမြစ်အဖြစ် ရှုလေ့လာသင့်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူ့ဘာသာပြန်ပညာရှင်များမှ ပရော်ဖက်ရှင်နယ် ဘာသာပြန်ခြင်းကို အကြံပြုပါသည်။ ဤဘာသာပြန်ကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော အလွဲအမှားများ သို့မဟုတ် အနားယူမှားမှုများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။\n"
"\n---\n\n**အကြောင်းကြားချက်**: \nဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှုအတွက် ကြိုးစားနေသော်လည်း အလိုအလျောက် ဘာသာပြန်ခြင်းတွင် အမှားများ သို့မဟုတ် မတိကျမှုများ ပါဝင်နိုင်သည်ကို သတိပြုပါ။ မူရင်းဘာသာစကားဖြင့် ရေးသားထားသော စာရွက်စာတမ်းကို အာဏာတရ အရင်းအမြစ်အဖြစ် သတ်မှတ်သင့်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူ့ဘာသာပြန်ပညာရှင်များကို အသုံးပြုရန် အကြံပြုပါသည်။ ဤဘာသာပြန်ကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော အလွဲအမှားများ သို့မဟုတ် အနားယူမှုများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။\n"
]
}
],
@ -1074,8 +1082,8 @@
"start_slideshow_at": "selected"
},
"coopTranslator": {
"original_hash": "914fc55f59efc7e17b8130d4033ac617",
"translation_date": "2025-08-30T09:51:58+00:00",
"original_hash": "d67e5b54ba20b507aa88d71aa3d042d8",
"translation_date": "2025-10-03T13:48:34+00:00",
"source_file": "lessons/3-NeuralNetworks/03-Perceptron/Perceptron.ipynb",
"language_code": "my"
}

View File

@ -11,11 +11,11 @@
"source": [
"## पर्सेप्ट्रोन\n",
"\n",
"> यो नोटबुक [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners) को एक हिस्सा हो। सम्पूर्ण अध्ययन सामग्रीको लागि रिपोजिटरी भ्रमण गर्नुहोस्।\n",
"> यो नोटबुक [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners) को एक भाग हो। सम्पूर्ण सिकाइ सामग्रीको लागि रिपोजिटरी भ्रमण गर्नुहोस्।\n",
"\n",
"जसरी हामीले छलफल गरिसकेका छौं, पर्सेप्ट्रोनले तपाईंलाई **द्विआधारी वर्गीकरण समस्या** समाधान गर्न अनुमति दिन्छ, अर्थात् इनपुट उदाहरणहरूलाई दुई वर्गहरूमा वर्गीकृत गर्न - हामी तिनीहरूलाई **सकारात्मक** र **नकारात्मक** भन्न सक्छौं।\n",
"जसरी हामीले चर्चा गर्यौं, पर्सेप्ट्रोनले तपाईंलाई **द्वैध वर्गीकरण समस्या** समाधान गर्न अनुमति दिन्छ, अर्थात् इनपुट उदाहरणहरूलाई दुई वर्गहरूमा वर्गीकृत गर्न - हामी तिनीहरूलाई **सकारात्मक** र **नकारात्मक** भन्न सक्छौं।\n",
"\n",
"सुरुमा, आवश्यक पुस्तकालयहरू आयात गरौं।\n"
"पहिले, केही आवश्यक पुस्तकालयहरू आयात गरौं।\n"
]
},
{
@ -49,9 +49,9 @@
"source": [
"## खेलौना समस्या\n",
"\n",
"सुरुमा, हामी दुईवटा इनपुट विशेषताहरू भएको एउटा सानो समस्या लिएर सुरु गरौं। उदाहरणका लागि, चिकित्सा क्षेत्रमा हामी ट्युमरहरूलाई यसको आकार र उमेरको आधारमा सौम्य र घातकमा वर्गीकृत गर्न चाहन सक्छौं।\n",
"सुरुमा, हामी दुई इनपुट विशेषताहरू भएको एउटा खेलौना समस्या सुरु गरौं। उदाहरणका लागि, चिकित्सा क्षेत्रमा हामी ट्युमरहरूलाई यसको आकार र उमेरको आधारमा सौम्य (benign) र घातक (malignant) वर्गीकृत गर्न चाहन सक्छौं।\n",
"\n",
"हामी SciKit Learn पुस्तकालयको `make_classification` फंक्शन प्रयोग गरेर एउटा र्यान्डम वर्गीकरण डेटासेट तयार गर्नेछौं:\n"
"हामी SciKit Learn पुस्तकालयको `make_classification` फंक्शन प्रयोग गरेर एउटा र्यान्डम वर्गीकरण डेटासेट उत्पन्न गर्नेछौं:\n"
]
},
{
@ -95,7 +95,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"आउनुहोस्, डेटासेट पनि प्लट गरौं:\n"
"हामी डेटासेट पनि प्लट गरौं:\n"
]
},
{
@ -154,7 +154,7 @@
"source": [
"## पर्सेप्ट्रोन\n",
"\n",
"पर्सेप्ट्रोन एक द्विआधारी वर्गीकरणकर्ता हो, त्यसैले प्रत्येक इनपुट भेक्टर $x$ को लागि हाम्रो पर्सेप्ट्रोनको आउटपुट +1 वा -1 हुनेछ, वर्गको आधारमा। आउटपुट निम्न सूत्र प्रयोग गरेर गणना गरिनेछ:\n",
"पर्सेप्ट्रोन एक द्विआधारी वर्गीकरणकर्ता भएकोले, प्रत्येक इनपुट भेक्टर $x$ को लागि हाम्रो पर्सेप्ट्रोनको आउटपुट +1 वा -1 हुनेछ, वर्गको आधारमा। आउटपुट निम्न सूत्र प्रयोग गरेर गणना गरिनेछ:\n",
"\n",
"$$y(\\mathbf{x}) = f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x})$$\n",
"\n",
@ -166,7 +166,7 @@
" \\end{cases} \\\\\n",
"$$\n",
"\n",
"तर, एक सामान्य रेखीय मोडेलमा बायस पनि हुनुपर्छ, अर्थात् आदर्श रूपमा हामी $y$ लाई $y=f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}+\\mathbf{b})$ को रूपमा गणना गर्नुपर्छ। हाम्रो मोडेललाई सरल बनाउनको लागि, हामी इनपुट विशेषताहरूमा एउटा थप आयाम थप्न सक्छौं, जुन सधैं 1 बराबर हुन्छ, यस बायस पदलाई हटाउन:\n"
"तर, एक सामान्य रेखीय मोडेलमा बायस पनि हुनुपर्छ, अर्थात् आदर्श रूपमा हामी $y$ लाई $y=f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}+\\mathbf{b})$ को रूपमा गणना गर्नुपर्छ। हाम्रो मोडेललाई सरल बनाउन, हामी इनपुट विशेषताहरूमा एउटा थप आयाम थपेर, जुन सधैं 1 बराबर हुन्छ, यो बायस टर्मलाई हटाउन सक्छौं:\n"
]
},
{
@ -206,20 +206,20 @@
"source": [
"## प्रशिक्षण एल्गोरिदम\n",
"\n",
"Perceptron लाई प्रशिक्षण दिनको लागि, हामीले तौलहरू $\\mathbf{w}$ पत्ता लगाउनुपर्छ जसले त्रुटि न्यूनतम बनाउँछ। त्रुटि **perceptron मापदण्ड** प्रयोग गरेर परिभाषित गरिन्छ:\n",
"परसेप्ट्रोनलाई प्रशिक्षण दिनको लागि, हामीले तौलहरू $\\mathbf{w}$ पत्ता लगाउनुपर्छ जसले त्रुटि न्यूनतम बनाउँछ। त्रुटि **परसेप्ट्रोन मापदण्ड** प्रयोग गरेर परिभाषित गरिन्छ:\n",
"\n",
"$$E(\\mathbf{w}) = -\\sum_{n \\in \\mathcal{M}}\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}_{n}t_{n}$$\n",
" \n",
" * $t_{n} \\in \\{-1, +1\\}$ नकारात्मक र सकारात्मक प्रशिक्षण नमूनाहरूको लागि क्रमशः\n",
" * $\\mathcal{M}$ - गलत वर्गीकृत उदाहरणहरूको सेट\n",
" \n",
"हामी **gradient descent** प्रक्रियाको प्रयोग गर्नेछौं। केही प्रारम्भिक अनियमित तौलहरू $\\mathbf{w}^{(0)}$ बाट सुरु गर्दै, हामी प्रत्येक प्रशिक्षण चरणमा $E$ को gradient प्रयोग गरेर तौलहरू समायोजन गर्नेछौं:\n",
"हामी **ग्रेडियन्ट डिसेन्ट** प्रक्रियाको प्रयोग गर्नेछौं। केही सुरुवाती अनियमित तौलहरू $\\mathbf{w}^{(0)}$ बाट सुरु गर्दै, हामी प्रत्येक प्रशिक्षण चरणमा $E$ को ग्रेडियन्ट प्रयोग गरेर तौलहरू समायोजन गर्नेछौं:\n",
"\n",
"$$\\mathbf{w}^{\\tau + 1}=\\mathbf{w}^{\\tau} - \\eta \\nabla E(\\mathbf{w}) = \\mathbf{w}^{\\tau} + \\eta\\sum_{n \\in \\mathcal{M}}\\mathbf{x}_{n} t_{n}$$\n",
"\n",
"जहाँ $\\eta$ **learning rate** हो, र $\\tau\\in\\mathbb{N}$ - iteration को संख्या।\n",
"जहाँ $\\eta$ **शिक्षण दर** हो, र $\\tau\\in\\mathbb{N}$ - पुनरावृत्तिको संख्या।\n",
"\n",
"यस एल्गोरिदमलाई Python मा यसरी परिभाषित गरौं:\n"
"अब, यस एल्गोरिदमलाई Python मा परिभाषित गरौं:\n"
]
},
{
@ -271,7 +271,9 @@
{
"cell_type": "markdown",
"metadata": {},
"source": []
"source": [
"अब हाम्रो डाटासेटमा प्रशिक्षण चलाउँ।\n"
]
},
{
"cell_type": "code",
@ -309,9 +311,9 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"जस्तो कि तपाईंले देख्न सक्नुहुन्छ, सुरुवाती शुद्धता लगभग ५०% छ, तर यो छिट्टै बढेर ९०% नजिकका उच्च मानहरूमा पुग्छ।\n",
"जस्तो तपाईंले देख्न सक्नुहुन्छ, सुरुवाती शुद्धता लगभग ५०% छ, तर यो चाँडै बढेर ९०% नजिकको उच्च मानहरूमा पुग्छ।\n",
"\n",
"अब कक्षाहरू कसरी छुट्याइन्छन् भन्ने कुरा दृश्यात्मक रूपमा हेरौं। हाम्रो वर्गीकरण कार्य $\\mathbf{w}^Tx$ जस्तो देखिन्छ, र यो एक कक्षाको लागि भन्दा ठूलो हुन्छ, र अर्को कक्षाको लागि भन्दा सानो। त्यसैले, कक्षा छुट्याउने रेखा $\\mathbf{w}^Tx = 0$ द्वारा परिभाषित हुन्छ। किनकि हामीसँग केवल दुई आयाम $x_0$ र $x_1$ छन्, रेखाको समीकरण $w_0x_0+w_1x_1+w_2 = 0$ हुनेछ (याद गर्नुहोस् कि हामीले स्पष्ट रूपमा एक अतिरिक्त आयाम $x_2=1$ परिभाषित गरेका छौं)। अब यो रेखा प्लट गरौं:\n"
"अब कक्षाहरू कसरी छुट्याइन्छन् भनेर दृश्यात्मक बनाऔं। हाम्रो वर्गीकरण कार्य $\\mathbf{w}^Tx$ जस्तो देखिन्छ, र यो एक कक्षाको लागि भन्दा ठूलो हुन्छ, र अर्को कक्षाको लागि भन्दा सानो। त्यसैले, कक्षा छुट्याउने रेखा $\\mathbf{w}^Tx = 0$ द्वारा परिभाषित हुन्छ। किनकि हामीसँग केवल दुई आयाम $x_0$ र $x_1$ छन्, रेखाको समीकरण $w_0x_0+w_1x_1+w_2 = 0$ हुनेछ (याद गर्नुहोस् कि हामीले स्पष्ट रूपमा एक अतिरिक्त आयाम $x_2=1$ परिभाषित गरेका छौं)। अब यो रेखा प्लट गरौं:\n"
]
},
{
@ -379,7 +381,7 @@
"source": [
"## परीक्षण डाटासेटमा मूल्यांकन गर्नुहोस्\n",
"\n",
"सुरुमा, हामीले केही डाटा छुट्याएर परीक्षण डाटासेटमा राखेका छौं। अब हेरौं कि हाम्रो वर्गीकरणकर्ता यो परीक्षण डाटासेटमा कति सही छ। यसलाई गर्नको लागि, हामी परीक्षण डाटासेटमा एउटा अतिरिक्त आयाम थप्छौं, तौल म्याट्रिक्ससँग गुणन गर्छौं, र सुनिश्चित गर्छौं कि प्राप्त मान लेबल (+1 वा -1) को समान चिन्हको छ। त्यसपछि हामी सबै बूलियन मानहरूलाई जोड्छौं र परीक्षण नमूनाको लम्बाइले भाग लगाउँछौं, सटीकता प्राप्त गर्न:\n"
"सुरुमा, हामीले केही डाटा परीक्षण डाटासेटका लागि छुट्याएका थियौं। अब हेरौं कि हाम्रो वर्गीकरणकर्ता यो परीक्षण डाटासेटमा कति सही छ। यसका लागि, हामी परीक्षण डाटासेटलाई थप आयामसँग विस्तार गर्छौं, तौल म्याट्रिक्ससँग गुणन गर्छौं, र सुनिश्चित गर्छौं कि प्राप्त मान लेबलको जस्तै चिन्ह (+1 वा -1) छ। त्यसपछि हामी सबै बूलियन मानहरूलाई जोड्छौं र परीक्षण नमूनाको लम्बाइले भाग गर्छौं, सहीताको गणना गर्न:\n"
]
},
{
@ -418,9 +420,9 @@
}
},
"source": [
"## प्रशिक्षण प्रक्रियालाई अवलोकन गर्दै\n",
"## प्रशिक्षण प्रक्रिया अवलोकन गर्दै\n",
"\n",
"हामीले पहिले देखिसकेका छौं कि प्रशिक्षणको क्रममा शुद्धता कसरी घट्छ। प्रशिक्षणको क्रममा छुट्ट्याउने रेखा कसरी व्यवहार गर्छ भन्ने हेर्न पाउनु राम्रो हुनेछ। तलको कोडले सबै कुरा एउटै ग्राफमा देखाउनेछ, र तपाईंले स्लाइडर सारेर प्रशिक्षण प्रक्रियामा \"समय यात्रा\" गर्न सक्नुहुनेछ।\n"
"हामीले पहिले देखेका थियौं कि प्रशिक्षणको क्रममा शुद्धता घट्छ। प्रशिक्षणको क्रममा छुट्ट्याउने रेखा कसरी व्यवहार गर्छ भन्ने हेर्न राम्रो हुनेछ। तलको कोडले सबै कुरा ए ग्राफमा देखाउनेछ, र तपाईंले स्लाइडर सारेर प्रशिक्षण प्रक्रियामा \"समय यात्रा\" गर्न सक्नुहुनेछ।\n"
]
},
{
@ -525,18 +527,18 @@
}
},
"source": [
"## परसेप्ट्रोनको सीमितताहरू\n",
"## परसेप्ट्रोनका सीमाहरू\n",
"\n",
"जस्तो तपाईंले माथि देख्नुभयो, परसेप्ट्रोन एक **रेखीय वर्गीकरणकर्ता** हो। यदि दुई वर्गहरू **रेखीय रूपमा छुट्याउन सकिने** छन्, अर्थात् सीधा रेखाले छुट्याउन सकिन्छ भने, परसेप्ट्रोनले ती वर्गहरू राम्रोसँग छुट्याउन सक्छ। अन्यथा, परसेप्ट्रोनको प्रशिक्षण प्रक्रिया सफलतापूर्वक समाप्त हुँदैन।\n",
"जसरी तपाईंले माथि देख्नुभयो, परसेप्ट्रोन एक **रेखीय वर्गीकरणकर्ता** हो। यदि दुई वर्गहरू **रेखीय रूपमा छुट्याउन मिल्ने** छन्, अर्थात् सीधा रेखाले छुट्याउन सकिन्छ भने, यसले ती वर्गहरूलाई राम्रोसँग छुट्याउन सक्छ। अन्यथा, परसेप्ट्रोनको प्रशिक्षण प्रक्रिया मिल्दैन।\n",
"\n",
"परसेप्ट्रोनले समाधान गर्न नसक्ने समस्याको सबैभन्दा स्पष्ट उदाहरण भनेको **XOR समस्या** हो। हामी चाहन्छौं कि हाम्रो परसेप्ट्रोनले XOR बूलियन फलन सिकून, जसको सत्यतालिका निम्न प्रकारको छ:\n",
"परसेप्ट्रोनले समाधान गर्न नसक्ने समस्याको सबैभन्दा स्पष्ट उदाहरण भनेको **XOR समस्या** हो। हामी चाहन्छौं कि हाम्रो परसेप्ट्रोनले XOR बूलियन फलन सिकोस्, जसको सत्य तालिका यस प्रकार छ:\n",
"\n",
"| | 0 | 1 |\n",
"|---|---|---|\n",
"| 0 | 0 | 1 | \n",
"| 1 | 1 | 0 |\n",
"\n",
"आउनुहोस्, यसलाई प्रयास गरौं! हामी सबै सकारात्मक र नकारात्मक प्रशिक्षण नमूनाहरू म्यानुअली भर्नेछौं, अनि माथि परिभाषित गरिएको हाम्रो train function लाई कल गर्नेछौं:\n"
"अब हामी यसलाई प्रयास गरौं! हामी सबै सकारात्मक र नकारात्मक प्रशिक्षण नमूनाहरूलाई म्यानुअली भर्नेछौं, र त्यसपछि माथि परिभाषित गरिएको हाम्रो train function लाई कल गर्नेछौं:\n"
]
},
{
@ -603,21 +605,21 @@
}
},
"source": [
"जस्तो कि माथिको ग्राफबाट देख्न सकिन्छ, सटीकता कहिल्यै ७५% भन्दा माथि जान सक्दैन, किनभने सबै सम्भावित उदाहरणहरूलाई सही बनाउनको लागि सीधा रेखा कोर्न असम्भव छ।\n",
"जस्तो कि माथिको ग्राफबाट देख्न सकिन्छ, शुद्धता कहिल्यै ७५% भन्दा माथि जान सक्दैन, किनभने सबै सम्भावित उदाहरणहरू सही पार्न सीधा रेखा कोर्न असम्भव छ।\n",
"\n",
"XOR समस्या परसेप्ट्रोनको सीमाहरूको एक क्लासिकल उदाहरण हो, र यो १९६९ मा मार्विन मिन्स्की र सेमोर पेपर्टले आफ्नो पुस्तक [Perceptrons](https://en.wikipedia.org/wiki/Perceptrons_(book)) मा औंल्याएका थिए। यो अवलोकनले न्यूरल नेटवर्कको क्षेत्रमा लगभग १० वर्षसम्म अनुसन्धानलाई सीमित गर्यो, यद्यपि - र हामी यो हाम्रो पाठको अर्को खण्डमा देख्नेछौं - बहु-स्तरीय परसेप्ट्रोनहरूले यस्ता समस्याहरू समाधान गर्न पूर्ण रूपमा सक्षम छन्।\n",
"XOR समस्या परसेप्ट्रोनको सीमाको एक क्लासिकल उदाहरण हो, र यो मार्विन मिन्स्की र सेमोर पेपर्टले १९६९ मा आफ्नो पुस्तक [Perceptrons](https://en.wikipedia.org/wiki/Perceptrons_(book)) मा उल्लेख गरेका थिए। यो अवलोकनले न्यूरल नेटवर्कको क्षेत्रमा लगभग १० वर्षसम्म अनुसन्धानलाई सीमित गर्यो, यद्यपि - र हामी यो हाम्रो पाठको अर्को खण्डमा देख्नेछौं - बहु-स्तरीय परसेप्ट्रोनहरूले यस्ता समस्याहरू समाधान गर्न पूर्ण रूपमा सक्षम छन्।\n",
"\n",
"## जटिल उदाहरण - MNIST\n",
"\n",
"यद्यपि परसेप्ट्रोनले XOR समस्या समाधान गर्न सक्दैन, यसले हस्तलिखित अक्षर पहिचान जस्ता धेरै जटिल समस्याहरू समाधान गर्न सक्छ।\n",
"\n",
"मेसिन लर्निङ सिक्दा प्राय: प्रयोग गरिने डटासेटलाई [MNIST](https://en.wikipedia.org/wiki/MNIST_database) भनिन्छ। यो Modified National Institute of Standards and Technology द्वारा सिर्जना गरिएको हो, र यसमा ६०, हस्तलिखित अंकहरूको प्रशिक्षण सेट समावेश छ, जुन लगभग २५० विद्यार्थी र संस्थाका कर्मचारीहरूबाट सङ्कलन गरिएको हो। साथै, १०, अंकहरूको परीक्षण डाटासेट पनि छ, जुन फरक व्यक्तिहरूबाट सङ्कलन गरिएको छ।\n",
"मेसिन लर्निङ सिक्दा प्राय: प्रयोग गरिने डटासेटलाई [MNIST](https://en.wikipedia.org/wiki/MNIST_database) भनिन्छ। यो Modified National Institute of Standards and Technology द्वारा सिर्जना गरिएको हो, र यसमा ६०, हस्तलिखित अंकहरूको प्रशिक्षण सेट समावेश छ, जुन लगभग २५० विद्यार्थी र संस्थाका कर्मचारीहरूबाट संकलन गरिएको हो। त्यस्तै, १०, अंकहरूको परीक्षण डेटासेट पनि छ, जुन विभिन्न व्यक्तिहरूबाट संकलन गरिएको छ।\n",
"\n",
"सबै अंकहरू २८x२८ पिक्सेल साइजका ग्रेस्केल छविहरूद्वारा प्रतिनिधित्व गरिएका छन्।\n",
"सबै अंकहरू २८x२८ पिक्सेलको ग्रेस्केल छविहरूद्वारा प्रतिनिधित्व गरिएका छन्।\n",
"\n",
"> MNIST डटासेट [Kaggle](https://www.kaggle.com/c/digit-recognizer) मा प्रशिक्षण प्रतियोगिताको रूपमा उपलब्ध छ, जुन मेसिन लर्निङ प्रतियोगिता र प्रतिस्पर्धाहरू आयोजना गर्ने साइट हो। एकपटक तपाईंले MNIST अंकहरू वर्गीकृत गर्न सिक्नुभयो भने, तपाईं आफ्नो समाधान Kaggle मा पेश गर्न सक्नुहुन्छ र अन्य सहभागीहरूसँग तुलना गरेर यसको मूल्याङ्कन हेर्न सक्नुहुन्छ।\n",
"> MNIST डटासेट [Kaggle](https://www.kaggle.com/c/digit-recognizer) मा प्रशिक्षण प्रतियोगिताको रूपमा उपलब्ध छ, जुन मेसिन लर्निङ प्रतियोगिता र प्रतिस्पर्धाहरू आयोजना गर्ने साइट हो। जब तपाईं MNIST अंकहरू वर्गीकृत गर्न सिक्नुहुन्छ, तपाईं आफ्नो समाधान Kaggle मा पेश गर्न सक्नुहुन्छ र अन्य सहभागीहरूसँग तुलना गरेर यसको मूल्याङ्कन हेर्न सक्नुहुन्छ।\n",
"\n",
"हामी MNIST डटासेट लोड गरेर सुरु गर्छौं:\n"
"हामी MNIST डटासेट लोड गरेर सुरु गर्छौं:\n"
]
},
{
@ -642,7 +644,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"अब हामी डेटासेट प्लट गरौं:\n"
"अब डेटासेट प्लट गरौं:\n"
]
},
{
@ -693,7 +695,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"किनभने परसेप्ट्रोन एक द्विआधारी वर्गीकरणकर्ता हो, हामी हाम्रो समस्यालाई केवल दुई अंकहरूलाई चिन्नेमा सीमित गर्नेछौं। तलको कार्यले दुई दिइएका अंकहरूका साथ सकारात्मक र नकारात्मक नमूना एरेहरू भर्नेछ (र स्पष्टताको लागि ती अंकहरूको नमूनाहरू पनि देखाउनेछ)।\n"
"किनभने परसेप्ट्रोन एक द्विआधारी वर्गीकरणकर्ता हो, हामी हाम्रो समस्यालाई केवल दुई अंकहरू पहिचान गर्न सीमित गर्नेछौं। तलको कार्यले दुई दिइएका अंकहरू सहित सकारात्मक र नकारात्मक नमूना एरेहरू भर्नेछ (र स्पष्टताको लागि ती अंकहरूको नमूनाहरू पनि देखाउनेछ)।\n"
]
},
{
@ -732,7 +734,9 @@
{
"cell_type": "markdown",
"metadata": {},
"source": []
"source": [
"हामी र १ बीच वर्गीकरण गर्ने प्रयास गरेर सुरु गर्नेछौं:\n"
]
},
{
"cell_type": "code",
@ -827,11 +831,11 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"कृपया ध्यान दिनुहोस् कि कसरी सटीकता धेरै छिटो लगभग १००% सम्म पुग्छ।\n",
"कृपया ध्यान दिनुहोस् कि सटीकता धेरै छिटो लगभग १००% सम्म पुग्छ।\n",
"\n",
"कृपया, प्रशिक्षणको अन्त्यतिर स्लाइडरलाई केही स्थानमा सार्नुहोस्, र बायाँपट्टि प्लट गरिएको वजन म्याट्रिक्सलाई अवलोकन गर्नुहोस्। यो म्याट्रिक्सले तपाईलाई बुझ्न मद्दत गर्नेछ कि कसरी परसेप्ट्रोन वास्तवमा काम गर्छ। तपाईले क्षेत्रको बीचमा उच्च वजन मानहरू देख्न सक्नुहुन्छ, जुन ती पिक्सेलहरूसँग मेल खान्छ जुन सामान्यतया अंक १ को लागि हुन्छ, र छेउतिर कम नकारात्मक मानहरू, जहाँ अंक का भागहरू हुन्छन्। त्यसैले, यदि परसेप्ट्रोनलाई प्रस्तुत गरिएको अंक वास्तवमा १ हो भने, यसको बीचको भाग उच्च मानहरूसँग गुणा हुनेछ, जसले सकारात्मक परिणाम उत्पादन गर्नेछ। यसको विपरीत, जब परसेप्ट्रोनले देख्छ, त्यससँग सम्बन्धित पिक्सेलहरू नकारात्मक संख्याहरूले गुणा गरिनेछ।\n",
"कृपया, प्रशिक्षणको अन्त्यतिर स्लाइडरलाई कुनै स्थानमा सार्नुहोस्, र बायाँपट्टि प्लट गरिएको वजन म्याट्रिक्सलाई अवलोकन गर्नुहोस्। यो म्याट्रिक्सले तपाईलाई बुझ्न मद्दत गर्नेछ कि परसेप्ट्रोन वास्तवमा कसरी काम गर्छ। तपाईले क्षेत्रको बीचमा उच्च वजन मानहरू देख्न सक्नुहुन्छ, जुन सामान्यतया अंक १ को लागि उपस्थित हुने पिक्सेलसँग मेल खान्छ, र छेउमा कम नकारात्मक मानहरू, जहाँ अंक को भागहरू हुन्छन्। त्यसैले, यदि परसेप्ट्रोनलाई प्रस्तुत गरिएको अंक वास्तवमा १ हो भने, यसको बीच भाग उच्च मानहरूद्वारा गुणा गरिनेछ, जसले सकारात्मक परिणाम उत्पादन गर्नेछ। यसको विपरीत, जब पर्सेप्ट्रोनले अवलोकन गर्छ, सम्बन्धित पिक्सेलहरू नकारात्मक संख्याद्वारा गुणा गरिनेछन्।\n",
"\n",
"> तपाईले यो पनि देख्न सक्नुहुन्छ कि यदि हामीले हाम्रो परसेप्ट्रोनलाई अलिकति तेर्सो सरेको अंक १ दियौं, जसले गर्दा यसको पिक्सेलहरूले त्यस्तो स्थान ओगट्छ जहाँ को ठाडो भागहरू हुन्छन्, हामीले गलत परिणाम प्राप्त गर्न सक्छौं। किनभने हाम्रो MNIST डेटासेटको प्रकृति यस्तो छ कि सबै अंकहरू केन्द्रित र सही रूपमा स्थित छन्, र परसेप्ट्रोनले अंकहरू छुट्याउन यसमा निर्भर गर्दछ।\n",
"> तपाईले यो पनि देख्न सक्नुहुन्छ कि यदि हामीले हाम्रो पर्सेप्ट्रोनलाई अंक १ थोरै क्षैतिज रूपमा सारेर दिन्छौं, जसले गर्दा यसको पिक्सेलहरू त्यहाँको स्थान ओगट्छ जहाँ को ठाडो भागहरू छन्, हामीले गलत परिणाम प्राप्त गर्न सक्छौं। किनभने हाम्रो MNIST डेटासेटको प्रकृति यस्तो छ कि सबै अंकहरू केन्द्रित र सही रूपमा स्थित छन्, र परसेप्ट्रोनले अंकहरू छुट्याउन यसमा निर्भर गर्दछ।\n",
"\n",
"अब विभिन्न अंकहरू प्रयास गरौं:\n"
]
@ -909,11 +913,11 @@
"source": [
"## छलफल\n",
"\n",
"केही कारणले गर्दा, २ र ५ लाई सजिलै छुट्याउन सकिँदैन। यद्यपि हामीलाई तुलनात्मक रूपमा उच्च शुद्धता (८५% भन्दा माथि) प्राप्त हुन्छ, हामी स्पष्ट रूपमा देख्न सक्छौं कि कुनै बिन्दुमा perceptron ले सिक्न छोड्छ।\n",
"कुनै कारणले गर्दा, २ र ५ लाई सजिलै छुट्याउन सकिँदैन। यद्यपि हामील तुलनात्मक रूपमा उच्च शुद्धता (८५% भन्दा माथि) प्राप्त गर्छौं, हामी स्पष्ट रूपमा देख्न सक्छौं कि कसरी Perceptron केही बिन्दुमा सिक्न रोक्छ।\n",
"\n",
"यो किन हुन्छ भनेर बुझ्नका लागि, हामी [Principal Component Analysis](https://en.wikipedia.org/wiki/Principal_component_analysis) (PCA) प्रयोग गर्न सक्छौं। यो एक मेसिन लर्निङ प्रविधि हो जसले इनपुट डेटासेटको आयाम घटाउन प्रयोग गरिन्छ, जसले गर्दा वर्गहरू बीचको छुट्टयाउने क्षमता अधिकतम हुन्छ।\n",
"यो किन हुन्छ भनेर बुझ्नका लागि, हामी [Principal Component Analysis](https://en.wikipedia.org/wiki/Principal_component_analysis) (PCA) प्रयोग गर्न सक्छौं। यो एक मेसिन लर्निङ प्रविधि हो जसले इनपुट डेटासेटको आयाम घटाउन प्रयोग गरिन्छ, ताकि वर्गहरू बीचको छुट्टैपनलाई अधिकतम बनाउन सकियोस्।\n",
"\n",
"हाम्रो अवस्थामा, इनपुट छविमा ७८४ पिक्सेलहरू (इनपुट विशेषताहरू) हुन्छन्, र हामी PCA प्रयोग गरेर प्यारामिटरहरूको संख्या घटाएर २ मा ल्याउन चाहन्छौं, ताकि हामी तिनीहरूलाई ग्राफमा प्लट गर्न सकौं। ती दुई प्यारामिटरहरू मूल विशेषताहरूको रेखीय संयोजन हुनेछन्, र हामी यस प्रक्रियालाई हाम्रो मूल ७८४-आयामीय स्थानलाई \"घुमाउने\" र यसको प्रक्षेपणलाई २D-स्थानमा अवलोकन गर्ने रूपमा हेर्न सक्छौं, जबसम्म हामी वर्गहरूलाई छुट्याउनको लागि सबैभन्दा राम्रो दृश्य प्राप्त गर्दैनौं।\n"
"हाम्रो केसमा, इनपुट इमेजमा ७८४ पिक्सेल (इनपुट विशेषताहरू) छन्, र हामी PCA प्रयोग गरेर प्यारामिटरहरूको संख्या केवल २ मा घटाउन चाहन्छौं, ताकि हामी तिनीहरूलाई ग्राफमा प्लट गर्न सकौं। ती दुई प्यारामिटरहरू मूल विशेषताहरूको रेखीय संयोजन हुनेछन्, र हामी यस प्रक्रियालाई हाम्रो मूल ७८४-आयामीय स्थानलाई \"घुमाउने\" र यसको प्रक्षेपणलाई २D-स्थानमा अवलोकन गर्ने रूपमा हेर्न सक्छौं, जबसम्म हामी वर्गहरू छुट्याउने सबैभन्दा राम्रो दृश्य प्राप्त गर्दैनौं।\n"
]
},
{
@ -1023,16 +1027,16 @@
}
},
"source": [
"जस्तो कि तपाईंले देख्न सक्नुहुन्छ, 0 र 1 लाई सीधा रेखाले स्पष्ट रूपमा छुट्याउन सकिन्छ। यसले संकेत गर्दछ कि मूल 784-आयामीय स्थानमा अंकहरूलाई प्रतिनिधित्व गर्ने बिन्दुहरू पनि रेखीय रूपमा छुट्याउन सकिन्छ। तर 2 र 5 को मामलामा, अंकहरूलाई स्पष्ट रूपमा छुट्याउने राम्रो प्रक्षेपण पाउन सकिँदैन, जसका कारण केही गलत वर्गीकरणका केसहरू देखिन्छन्।\n",
"जस्तो कि तपाईं देख्न सक्नुहुन्छ, 0 र 1 लाई स्पष्ट रूपमा एउटा सीधा रेखाले छुट्याउन सकिन्छ। यसले संकेत गर्दछ कि मूल 784-आयामीय स्थानमा अंकहरूलाई प्रतिनिधित्व गर्ने बिन्दुहरू पनि रेखीय रूपमा छुट्याउन सकिन्छ। तर 2 र 5 को मामलामा, अंकहरूलाई स्पष्ट रूपमा छुट्याउने राम्रो प्रक्षेपण पाउन सकिँदैन, जसका कारण केही गलत वर्गीकरणका केसहरू देखिन्छन्।\n",
"\n",
"> यस पाठक्रममा पछि हामी Neural Networks प्रयोग गरेर गैर-रेखीय वर्गीकरणकर्ता कसरी बनाउने भन्ने कुरा सिक्नेछौं, र अंकहरू सही रूपमा नजोडिएको समस्यालाई कसरी समाधान गर्ने भन्ने कुरा पनि बुझ्नेछौं। धेरै चाँडै हामी MNIST अंक वर्गीकरणमा 99% भन्दा माथिको शुद्धता प्राप्त गर्नेछौं, जहाँ हामी अंकहरूलाई 10 विभिन्न वर्गहरूमा वर्गीकृत गर्नेछौं।\n",
"> यस पाठक्रममा पछि हामी Neural Networks प्रयोग गरेर गैर-रेखीय वर्गीकरणकर्ता कसरी बनाउने भन्ने कुरा सिक्नेछौं, र अंकहरू सही रूपमा नजोडिएको समस्यासँग कसरी सामना गर्ने भन्ने कुरा पनि बुझ्नेछौं। धेरै चाँडै हामी MNIST अंक वर्गीकरणमा 99% भन्दा माथिको शुद्धता हासिल गर्नेछौं, जहाँ हामी अंकहरूलाई 10 विभिन्न वर्गहरूमा वर्गीकृत गर्नेछौं।\n",
"\n",
"## मुख्य कुरा\n",
"\n",
" * हामीले सबैभन्दा सरल Neural Network संरचना - एक-स्तरीय Perceptron को बारेमा सिक्यौं।\n",
" * हामीले Gradient Descent मा आधारित सरल प्रशिक्षण प्रक्रिया प्रयोग गरेर Perceptron \"हातले\" कार्यान्वयन गर्यौं।\n",
" * हामीले Gradient Descent आधारित सरल प्रशिक्षण प्रक्रिया प्रयोग गरेर Perceptron \"हातले\" कार्यान्वयन गर्यौं।\n",
" * सरलताका बाबजुद, एक-स्तरीय Perceptron हस्तलेखन गरिएको अंक पहिचानको जटिल समस्याहरू समाधान गर्न सक्षम छ।\n",
" * एक-स्तरीय Perceptron एक रेखीय वर्गीकरणकर्ता हो, र यसले Logistic Regression जत्तिकै वर्गीकरण शक्ति प्रदान गर्दछ।\n",
" * एक-स्तरीय Perceptron एक रेखीय वर्गीकरणकर्ता हो, र यसले Logistic Regression जत्तिकै वर्गीकरण क्षमता प्रदान गर्दछ।\n",
" * नमूना स्थानमा, Perceptron ले Hyperplane प्रयोग गरेर इनपुट डाटाका दुई वर्गहरू छुट्याउन सक्छ।\n"
]
},
@ -1042,14 +1046,14 @@
"source": [
"## श्रेय\n",
"\n",
"यो नोटबुक [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners) को एक भाग हो, र [Dmitry Soshnikov](http://soshnikov.com) द्वारा तयार गरिएको हो। यो Microsoft Research Cambridge मा आयोजित Neural Network Workshop बाट प्रेरित छ। केही कोड र चित्रात्मक सामग्रीहरू [Katja Hoffmann](https://www.microsoft.com/en-us/research/people/kahofman/), [Matthew Johnson](https://www.microsoft.com/en-us/research/people/matjoh/) र [Ryoto Tomioka](https://www.microsoft.com/en-us/research/people/ryoto/) का प्रस्तुतीकरणहरूबाट लिइएको हो, साथै [NeuroWorkshop](http://github.com/shwars/NeuroWorkshop) रिपोजिटरीबाट पनि।\n"
"यो नोटबुक [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners) को एक हिस्सा हो, र यसलाई [Dmitry Soshnikov](http://soshnikov.com) द्वारा तयार गरिएको हो। यो Microsoft Research Cambridge मा आयोजित Neural Network Workshop बाट प्रेरित छ। केही कोड र चित्रात्मक सामग्रीहरू [Katja Hoffmann](https://www.microsoft.com/en-us/research/people/kahofman/), [Matthew Johnson](https://www.microsoft.com/en-us/research/people/matjoh/) र [Ryoto Tomioka](https://www.microsoft.com/en-us/research/people/ryoto/) का प्रस्तुतीकरणहरूबाट लिइएको हो, साथै [NeuroWorkshop](http://github.com/shwars/NeuroWorkshop) रिपोजिटरीबाट पनि।\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**अस्वीकरण**: \nयो दस्तावेज़ AI अनुवाद सेवा [Co-op Translator](https://github.com/Azure/co-op-translator) प्रयोग गरी अनुवाद गरिएको हो। हामी यथासम्भव सटीकता सुनिश्चित गर्न प्रयास गर्छौं, तर कृपया ध्यान दिनुहोस् कि स्वचालित अनुवादहरूमा त्रुटि वा अशुद्धता हुन सक्छ। यसको मूल भाषामा रहेको मूल दस्तावेज़लाई आधिकारिक स्रोत मानिनुपर्छ। महत्त्वपूर्ण जानकारीका लागि, व्यावसायिक मानव अनुवाद सिफारिस गरिन्छ। यस अनुवादको प्रयोगबाट उत्पन्न हुने कुनै पनि गलतफहमी वा गलत व्याख्याक लागि हामी जिम्मेवार हुने छैनौं। \n"
"\n---\n\n**अस्वीकरण**: \nयो दस्तावेज़ AI अनुवाद सेवा [Co-op Translator](https://github.com/Azure/co-op-translator) प्रयोग गरेर अनुवाद गरिएको हो। हामी यथासम्भव शुद्धता सुनिश्चित गर्न प्रयास गर्छौं, तर कृपया ध्यान दिनुहोस् कि स्वचालित अनुवादमा त्रुटिहरू वा अशुद्धताहरू हुन सक्छ। मूल दस्तावेज़ यसको मातृभाषामा आधिकारिक स्रोत मानिनुपर्छ। महत्वपूर्ण जानकारीको लागि, व्यावसायिक मानव अनुवाद सिफारिस गरिन्छ। यस अनुवादको प्रयोगबाट उत्पन्न हुने कुनै पनि गलतफहमी वा गलत व्याख्याक लागि हामी जिम्मेवार हुने छैनौं।\n"
]
}
],
@ -1078,8 +1082,8 @@
"start_slideshow_at": "selected"
},
"coopTranslator": {
"original_hash": "914fc55f59efc7e17b8130d4033ac617",
"translation_date": "2025-08-29T06:50:55+00:00",
"original_hash": "d67e5b54ba20b507aa88d71aa3d042d8",
"translation_date": "2025-10-03T13:20:07+00:00",
"source_file": "lessons/3-NeuralNetworks/03-Perceptron/Perceptron.ipynb",
"language_code": "ne"
}

View File

@ -11,11 +11,11 @@
"source": [
"## Perceptron\n",
"\n",
"> Dit notitieboek maakt deel uit van [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners). Bezoek de repository voor de volledige set leermaterialen.\n",
"> Dit notebook maakt deel uit van [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners). Bezoek de repository voor de volledige set leermaterialen.\n",
"\n",
"Zoals we hebben besproken, stelt de perceptron je in staat om een **binaire classificatieprobleem** op te lossen, oftewel om invoer voorbeelden in twee klassen te classificeren - we kunnen ze **positief** en **negatief** noemen.\n",
"Zoals we hebben besproken, stelt de perceptron je in staat om **binaire classificatieproblemen** op te lossen, oftewel om invoer voorbeelden in twee klassen te classificeren - we kunnen ze **positief** en **negatief** noemen.\n",
"\n",
"Laten we eerst een paar benodigde bibliotheken importeren.\n"
"Laten we eerst enkele benodigde bibliotheken importeren.\n"
]
},
{
@ -47,7 +47,7 @@
}
},
"source": [
"## Speelgoedprobleem\n",
"## Speelprobleem\n",
"\n",
"Laten we beginnen met een eenvoudig probleem, waarbij we twee invoerkenmerken hebben. Bijvoorbeeld, in de geneeskunde willen we mogelijk tumoren classificeren als goedaardig of kwaadaardig, afhankelijk van hun grootte en leeftijd.\n",
"\n",
@ -95,7 +95,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Laten we de dataset ook plotten:\n"
"Laten we ook de dataset plotten:\n"
]
},
{
@ -154,7 +154,7 @@
"source": [
"## Perceptron\n",
"\n",
"Aangezien een perceptron een binaire classifier is, zal de output van ons perceptron voor elke invoervector $x$ +1 of -1 zijn, afhankelijk van de klasse. De output wordt berekend met de formule\n",
"Aangezien de perceptron een binaire classifier is, zal de output van onze perceptron voor elke invoervector $x$ +1 of -1 zijn, afhankelijk van de klasse. De output wordt berekend met de formule\n",
"\n",
"$$y(\\mathbf{x}) = f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x})$$\n",
"\n",
@ -206,20 +206,20 @@
"source": [
"## Trainingsalgoritme\n",
"\n",
"Om de perceptron te trainen, moeten we gewichten $\\mathbf{w}$ vinden die de fout minimaliseren. De fout wordt gedefinieerd met behulp van het **perceptroncriterium**:\n",
"Om de perceptron te trainen, moeten we gewichten $\\mathbf{w}$ vinden die de fout minimaliseren. De fout wordt gedefinieerd met behulp van **perceptroncriteria**:\n",
"\n",
"$$E(\\mathbf{w}) = -\\sum_{n \\in \\mathcal{M}}\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}_{n}t_{n}$$\n",
" \n",
" * $t_{n} \\in \\{-1, +1\\}$ voor respectievelijk negatieve en positieve trainingsvoorbeelden\n",
" * $\\mathcal{M}$ - een verzameling verkeerd geclassificeerde voorbeelden\n",
" \n",
"We zullen het proces van **gradient descent** gebruiken. Beginnend met willekeurige initiële gewichten $\\mathbf{w}^{(0)}$, passen we de gewichten aan bij elke stap van de training met behulp van de gradiënt van $E$:\n",
"We zullen het proces van **gradient descent** gebruiken. Beginnend met willekeurige initiële gewichten $\\mathbf{w}^{(0)}$, passen we de gewichten aan bij elke stap van de training met behulp van de gradient van $E$:\n",
"\n",
"$$\\mathbf{w}^{\\tau + 1}=\\mathbf{w}^{\\tau} - \\eta \\nabla E(\\mathbf{w}) = \\mathbf{w}^{\\tau} + \\eta\\sum_{n \\in \\mathcal{M}}\\mathbf{x}_{n} t_{n}$$\n",
"\n",
"waarbij $\\eta$ een **leersnelheid** is, en $\\tau\\in\\mathbb{N}$ - het aantal iteraties.\n",
"waarbij $\\eta$ een **leersnelheid** is, en $\\tau\\in\\mathbb{N}$ - aantal iteraties.\n",
"\n",
"Laten we dit algoritme in Python definiëren:\n"
"Laten we dit algoritme definiëren in Python:\n"
]
},
{
@ -271,7 +271,9 @@
{
"cell_type": "markdown",
"metadata": {},
"source": []
"source": [
"Laten we nu de training op onze dataset uitvoeren:\n"
]
},
{
"cell_type": "code",
@ -309,9 +311,9 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Zoals je kunt zien, is de initiële nauwkeurigheid ongeveer 50%, maar deze neemt snel toe tot hogere waarden dicht bij 90%.\n",
"Zoals je kunt zien, is de initiële nauwkeurigheid ongeveer 50%, maar deze stijgt snel naar hogere waarden dicht bij 90%.\n",
"\n",
"Laten we visualiseren hoe klassen worden gescheiden. Onze classificatiefunctie ziet eruit als $\\mathbf{w}^Tx$, en deze is groter dan 0 voor de ene klasse, en kleiner dan 0 voor de andere. Dus, de scheidingslijn tussen de klassen wordt gedefinieerd door $\\mathbf{w}^Tx = 0$. Aangezien we slechts twee dimensies hebben, $x_0$ en $x_1$, zou de vergelijking voor de lijn zijn $w_0x_0+w_1x_1+w_2 = 0$ (onthoud dat we expliciet een extra dimensie hebben gedefinieerd, $x_2=1$). Laten we deze lijn plotten:\n"
"Laten we visualiseren hoe de klassen worden gescheiden. Onze classificatiefunctie ziet eruit als $\\mathbf{w}^Tx$, en deze is groter dan 0 voor de ene klasse, en kleiner dan 0 voor de andere. Dus, de scheidingslijn tussen de klassen wordt gedefinieerd door $\\mathbf{w}^Tx = 0$. Aangezien we slechts twee dimensies hebben, $x_0$ en $x_1$, zou de vergelijking voor de lijn zijn $w_0x_0+w_1x_1+w_2 = 0$ (onthoud dat we expliciet een extra dimensie hebben gedefinieerd, $x_2=1$). Laten we deze lijn plotten:\n"
]
},
{
@ -379,7 +381,7 @@
"source": [
"## Evalueren op Testdataset\n",
"\n",
"In het begin hebben we wat gegevens apart gezet voor de testdataset. Laten we kijken hoe nauwkeurig onze classifier is op deze testdataset. Om dit te doen, breiden we de testdataset ook uit met een extra dimensie, vermenigvuldigen we met de gewichtenmatrix, en zorgen we ervoor dat de verkregen waarde hetzelfde teken heeft als het label (+1 of -1). Vervolgens tellen we alle booleaanse waarden bij elkaar op en delen we door de lengte van de testset om de nauwkeurigheid te bepalen:\n"
"Aan het begin hebben we een deel van de data apart gezet voor de testdataset. Laten we kijken hoe nauwkeurig onze classifier is op deze testdataset. Om dit te doen, breiden we de testdataset uit met een extra dimensie, vermenigvuldigen met de gewichtenmatrix, en zorgen ervoor dat de verkregen waarde hetzelfde teken heeft als het label (+1 of -1). Vervolgens tellen we alle booleaanse waarden bij elkaar op en delen door de lengte van de testset om de nauwkeurigheid te verkrijgen:\n"
]
},
{
@ -420,7 +422,7 @@
"source": [
"## Het trainingsproces observeren\n",
"\n",
"We hebben eerder gezien hoe de nauwkeurigheid afneemt tijdens het trainen. Het zou interessant zijn om te zien hoe de scheidingslijn zich gedraagt tijdens het trainen. De onderstaande code zal alles visualiseren in één grafiek, en je zou de schuifregelaar moeten kunnen gebruiken om door het trainingsproces te \"reizen\".\n"
"We hebben eerder gezien hoe de nauwkeurigheid afneemt tijdens het trainen. Het zou interessant zijn om te zien hoe de scheidingslijn zich gedraagt tijdens het trainen. De onderstaande code zal alles visualiseren op één grafiek, en je zou de schuifregelaar moeten kunnen gebruiken om door het trainingsproces te \"reizen\".\n"
]
},
{
@ -527,7 +529,7 @@
"source": [
"## Beperkingen van de Perceptron\n",
"\n",
"Zoals je hierboven hebt gezien, is een perceptron een **lineaire classifier**. Het kan goed onderscheid maken tussen twee klassen als ze **lineair scheidbaar** zijn, oftewel gescheiden kunnen worden door een rechte lijn. Anders zal het trainingsproces van de perceptron niet convergeren.\n",
"Zoals je hierboven hebt gezien, is de perceptron een **lineaire classifier**. Het kan twee klassen goed onderscheiden als ze **lineair scheidbaar** zijn, oftewel gescheiden kunnen worden door een rechte lijn. Anders zal het trainingsproces van de perceptron niet convergeren.\n",
"\n",
"Een duidelijk voorbeeld van een probleem dat niet door een perceptron kan worden opgelost, is het zogenaamde **XOR-probleem**. We willen dat onze perceptron de XOR-booleaanse functie leert, die de volgende waarheidstabel heeft:\n",
"\n",
@ -605,17 +607,17 @@
"source": [
"Zoals je kunt zien in de bovenstaande grafiek, gaat de nauwkeurigheid nooit boven de 75%, omdat het onmogelijk is om een rechte lijn te tekenen die alle mogelijke voorbeelden correct classificeert.\n",
"\n",
"Het XOR-probleem is een klassiek voorbeeld van de beperkingen van perceptrons, en het werd in 1969 aangekaart door Marvin Minsky en Seymour Papert in hun boek [Perceptrons](https://en.wikipedia.org/wiki/Perceptrons_(book)). Deze observatie beperkte het onderzoek op het gebied van neurale netwerken bijna 10 jaar, hoewel - en dat zullen we zien in het volgende deel van onze cursus - meerlagige perceptrons perfect in staat zijn om dergelijke problemen op te lossen.\n",
"Het XOR-probleem is een klassiek voorbeeld van de beperkingen van perceptrons, en dit werd in 1969 aangekaart door Marvin Minsky en Seymour Papert in hun boek [Perceptrons](https://en.wikipedia.org/wiki/Perceptrons_(book)). Deze observatie remde het onderzoek op het gebied van neurale netwerken bijna 10 jaar, hoewel - en dat zullen we in het volgende deel van onze cursus zien - meerlagige perceptrons dergelijke problemen perfect kunnen oplossen.\n",
"\n",
"## Complex voorbeeld - MNIST\n",
"\n",
"Hoewel een perceptron het XOR-probleem niet kan oplossen, kan het wel veel complexere problemen oplossen, zoals het herkennen van handgeschreven tekens.\n",
"Hoewel een perceptron het XOR-probleem niet kan oplossen, kan het wel veel complexere problemen aanpakken, zoals het herkennen van handgeschreven tekens.\n",
"\n",
"Een dataset die vaak wordt gebruikt bij het leren van machine learning heet [MNIST](https://en.wikipedia.org/wiki/MNIST_database). Deze dataset is gemaakt door het Modified National Institute of Standards and Technology en bevat een trainingsset van 60.000 handgeschreven cijfers, verzameld van ongeveer 250 studenten en medewerkers van het instituut. Er is ook een testdataset van 10.000 cijfers, verzameld van verschillende individuen.\n",
"Een dataset die vaak wordt gebruikt bij het leren van machine learning heet [MNIST](https://en.wikipedia.org/wiki/MNIST_database). Deze dataset is ontwikkeld door het Modified National Institute of Standards and Technology en bevat een trainingsset van 60.000 handgeschreven cijfers, verzameld van ongeveer 250 studenten en medewerkers van het instituut. Daarnaast is er een testdataset van 10.000 cijfers, verzameld van verschillende individuen.\n",
"\n",
"Alle cijfers worden weergegeven door grijswaardenafbeeldingen van 28x28 pixels.\n",
"Alle cijfers worden weergegeven als grijswaardenafbeeldingen van 28x28 pixels.\n",
"\n",
"> De MNIST-dataset is beschikbaar als een trainingscompetitie op [Kaggle](https://www.kaggle.com/c/digit-recognizer), een site die machine learning-wedstrijden en competities organiseert. Zodra je hebt geleerd hoe je MNIST-cijfers kunt classificeren, kun je je oplossing indienen bij Kaggle om te zien hoe deze wordt beoordeeld ten opzichte van andere deelnemers.\n",
"> De MNIST-dataset is beschikbaar als een trainingscompetitie op [Kaggle](https://www.kaggle.com/c/digit-recognizer), een website die machine learning-wedstrijden en competities organiseert. Zodra je hebt geleerd hoe je MNIST-cijfers kunt classificeren, kun je je oplossing indienen op Kaggle om te zien hoe deze wordt beoordeeld in vergelijking met andere deelnemers.\n",
"\n",
"We beginnen met het laden van de MNIST-dataset:\n"
]
@ -693,7 +695,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Omdat perceptron een binaire classifier is, zullen we ons probleem beperken tot het herkennen van slechts twee cijfers. De onderstaande functie zal positieve en negatieve steekproefarrays vullen met twee gegeven cijfers (en zal ook voorbeelden van die cijfers tonen voor duidelijkheid).\n"
"Omdat perceptron een binaire classifier is, zullen we ons probleem beperken tot het herkennen van slechts twee cijfers. De onderstaande functie zal positieve en negatieve monsterarrays vullen met twee gegeven cijfers (en zal ook voorbeelden van die cijfers tonen voor duidelijkheid).\n"
]
},
{
@ -829,11 +831,11 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Let op hoe de nauwkeurigheid bijna 100% bereikt, en dat nog vrij snel.\n",
"Let op hoe de nauwkeurigheid heel snel bijna 100% bereikt.\n",
"\n",
"Verplaats de schuifregelaar naar een positie richting het einde van de training en observeer de gewichts matrix die aan de linkerkant wordt weergegeven. Deze matrix helpt je te begrijpen hoe de perceptron daadwerkelijk werkt. Je kunt de hoge gewichtswaarden in het midden van het veld zien, die overeenkomen met pixels die typisch aanwezig zijn bij cijfer 1, en lage negatieve waarden aan de zijkanten, waar delen van cijfer 0 zich bevinden. Dus, als het cijfer dat aan de perceptron wordt gepresenteerd daadwerkelijk een 1 is, zal het middelste deel ervan vermenigvuldigd worden met hoge waarden, wat een positief resultaat oplevert. Daarentegen, wanneer de perceptron een 0 observeert, zullen de corresponderende pixels vermenigvuldigd worden met negatieve getallen.\n",
"Verplaats de schuifregelaar naar een positie tegen het einde van de training en bekijk de gewichts matrix die links wordt weergegeven. Deze matrix helpt je te begrijpen hoe de perceptron daadwerkelijk werkt. Je kunt de hoge gewichtswaarden in het midden van het veld zien, die overeenkomen met pixels die typisch aanwezig zijn bij het cijfer 1, en lage negatieve waarden aan de zijkanten, waar delen van het cijfer 0 zich bevinden. Dus, als het cijfer dat aan de perceptron wordt gepresenteerd daadwerkelijk een 1 is, zal het midden ervan worden vermenigvuldigd met hoge waarden, wat een positief resultaat oplevert. Daarentegen, wanneer de perceptron een 0 waarneemt, zullen de corresponderende pixels worden vermenigvuldigd met negatieve getallen.\n",
"\n",
"> Je kunt opmerken dat als we onze perceptron een cijfer 1 geven dat iets horizontaal verschoven is, zodat de pixels zich bevinden op de plek waar verticale delen van een 0 zijn, we mogelijk een incorrect resultaat krijgen. Omdat de aard van onze MNIST-dataset zodanig is dat alle cijfers gecentreerd en correct gepositioneerd zijn, vertrouwt de perceptron hierop om onderscheid te maken tussen cijfers.\n",
"> Je kunt opmerken dat als we onze perceptron een cijfer 1 geven dat iets horizontaal verschoven is, zodat de pixels zich bevinden op de plek waar verticale delen van een 0 zijn, we mogelijk een incorrect resultaat krijgen. Omdat de aard van onze MNIST-dataset zodanig is dat alle cijfers gecentreerd en correct gepositioneerd zijn, vertrouwt de perceptron hierop om onderscheid te maken tussen de cijfers.\n",
"\n",
"Laten we nu verschillende cijfers proberen:\n"
]
@ -911,9 +913,9 @@
"source": [
"## Discussie\n",
"\n",
"Om de een of andere reden zijn 2 en 5 niet zo gemakkelijk te scheiden. Hoewel we een relatief hoge nauwkeurigheid behalen (boven de 85%), kunnen we duidelijk zien hoe de perceptron op een bepaald moment stopt met leren.\n",
"Om de een of andere reden zijn 2 en 5 niet zo gemakkelijk te scheiden. Hoewel we een relatief hoge nauwkeurigheid behalen (boven de 85%), kunnen we duidelijk zien dat de perceptron op een bepaald moment stopt met leren.\n",
"\n",
"Om te begrijpen waarom dit gebeurt, kunnen we proberen [Principale Componentenanalyse](https://en.wikipedia.org/wiki/Principal_component_analysis) (PCA) te gebruiken. Dit is een machine learning-techniek die wordt gebruikt om de dimensionaliteit van de invoerdataset te verlagen, op een manier die de beste scheiding tussen klassen oplevert.\n",
"Om te begrijpen waarom dit gebeurt, kunnen we [Principal Component Analysis](https://en.wikipedia.org/wiki/Principal_component_analysis) (PCA) gebruiken. Dit is een machine learning-techniek die wordt gebruikt om de dimensionaliteit van de invoerdataset te verlagen, op een manier die de beste scheiding tussen klassen oplevert.\n",
"\n",
"In ons geval heeft een invoerafbeelding 784 pixels (invoerkenmerken), en we willen PCA gebruiken om het aantal parameters te reduceren tot slechts 2, zodat we ze op een grafiek kunnen plotten. Die twee parameters zouden een lineaire combinatie van de oorspronkelijke kenmerken zijn, en we kunnen dit proces zien als het \"roteren\" van onze oorspronkelijke 784-dimensionale ruimte en het observeren van de projectie ervan naar onze 2D-ruimte, totdat we het beste zicht krijgen dat de klassen scheidt.\n"
]
@ -1025,16 +1027,16 @@
}
},
"source": [
"Zoals je kunt zien, kunnen 0 en 1 duidelijk worden gescheiden door een rechte lijn. Dit geeft aan dat in de oorspronkelijke 784-dimensionale ruimte punten die overeenkomen met cijfers ook lineair scheidbaar zijn. In het geval van 2 en 5 kunnen we geen goede projectie vinden die de cijfers duidelijk scheidt, en daarom zijn er enkele gevallen van verkeerde classificatie.\n",
"Zoals je kunt zien, kunnen 0 en 1 duidelijk worden gescheiden door een rechte lijn. Dit geeft aan dat in de oorspronkelijke 784-dimensionale ruimte de punten die overeenkomen met cijfers ook lineair scheidbaar zijn. In het geval van 2 en 5 kunnen we geen goede projectie vinden die de cijfers duidelijk scheidt, en daarom zijn er enkele gevallen van verkeerde classificatie.\n",
"\n",
"> Later in deze cursus zullen we leren hoe we niet-lineaire classifiers kunnen maken met behulp van neurale netwerken, en hoe we het probleem kunnen aanpakken van cijfers die niet goed uitgelijnd zijn. Binnenkort zullen we een nauwkeurigheid van meer dan 99% bereiken in de classificatie van MNIST-cijfers, terwijl we ze indelen in 10 verschillende klassen.\n",
"\n",
"## Belangrijkste punten\n",
"\n",
" * We hebben geleerd over de eenvoudigste neurale netwerkarchitectuur - eenlaagse perceptron.\n",
" * We hebben het perceptron \"met de hand\" geïmplementeerd, met behulp van een eenvoudige trainingsprocedure gebaseerd op gradient descent.\n",
" * Ondanks de eenvoud kan een eenlaagse perceptron vrij complexe problemen oplossen, zoals het herkennen van handgeschreven cijfers.\n",
" * Een eenlaagse perceptron is een lineaire classifier, en biedt dus dezelfde classificatiemogelijkheden als logistische regressie.\n",
" * We hebben geleerd over de eenvoudigste neurale netwerkarchitectuur - de éénlaagse perceptron.\n",
" * We hebben de perceptron \"met de hand\" geïmplementeerd, met behulp van een eenvoudige trainingsprocedure gebaseerd op gradient descent.\n",
" * Ondanks de eenvoud kan een éénlaagse perceptron vrij complexe problemen oplossen, zoals het herkennen van handgeschreven cijfers.\n",
" * Een éénlaagse perceptron is een lineaire classifier en biedt dus dezelfde classificatiemogelijkheden als logistische regressie.\n",
" * In de voorbeeldruimte kan een perceptron twee klassen van invoergegevens scheiden met behulp van een hypervlak.\n"
]
},
@ -1044,14 +1046,14 @@
"source": [
"## Credits\n",
"\n",
"Dit notebook maakt deel uit van [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners) en is samengesteld door [Dmitry Soshnikov](http://soshnikov.com). Het is geïnspireerd door de Neural Network Workshop bij Microsoft Research Cambridge. Sommige code en illustratieve materialen zijn afkomstig uit presentaties van [Katja Hoffmann](https://www.microsoft.com/en-us/research/people/kahofman/), [Matthew Johnson](https://www.microsoft.com/en-us/research/people/matjoh/) en [Ryoto Tomioka](https://www.microsoft.com/en-us/research/people/ryoto/), en uit de [NeuroWorkshop](http://github.com/shwars/NeuroWorkshop) repository.\n"
"Dit notebook maakt deel uit van [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners) en is opgesteld door [Dmitry Soshnikov](http://soshnikov.com). Het is geïnspireerd door de Neural Network Workshop bij Microsoft Research Cambridge. Sommige code en illustratieve materialen zijn afkomstig uit presentaties van [Katja Hoffmann](https://www.microsoft.com/en-us/research/people/kahofman/), [Matthew Johnson](https://www.microsoft.com/en-us/research/people/matjoh/) en [Ryoto Tomioka](https://www.microsoft.com/en-us/research/people/ryoto/), en uit de [NeuroWorkshop](http://github.com/shwars/NeuroWorkshop) repository.\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Disclaimer**: \nDit document is vertaald met behulp van de AI-vertalingsservice [Co-op Translator](https://github.com/Azure/co-op-translator). Hoewel we streven naar nauwkeurigheid, dient u zich ervan bewust te zijn dat geautomatiseerde vertalingen fouten of onnauwkeurigheden kunnen bevatten. Het originele document in zijn oorspronkelijke taal moet worden beschouwd als de gezaghebbende bron. Voor cruciale informatie wordt professionele menselijke vertaling aanbevolen. Wij zijn niet aansprakelijk voor eventuele misverstanden of verkeerde interpretaties die voortvloeien uit het gebruik van deze vertaling.\n"
"\n---\n\n**Disclaimer**: \nDit document is vertaald met behulp van de AI-vertalingsservice [Co-op Translator](https://github.com/Azure/co-op-translator). Hoewel we streven naar nauwkeurigheid, dient u zich ervan bewust te zijn dat geautomatiseerde vertalingen fouten of onnauwkeurigheden kunnen bevatten. Het originele document in de oorspronkelijke taal moet worden beschouwd als de gezaghebbende bron. Voor cruciale informatie wordt professionele menselijke vertaling aanbevolen. Wij zijn niet aansprakelijk voor misverstanden of verkeerde interpretaties die voortvloeien uit het gebruik van deze vertaling.\n"
]
}
],
@ -1080,8 +1082,8 @@
"start_slideshow_at": "selected"
},
"coopTranslator": {
"original_hash": "914fc55f59efc7e17b8130d4033ac617",
"translation_date": "2025-08-28T22:23:32+00:00",
"original_hash": "d67e5b54ba20b507aa88d71aa3d042d8",
"translation_date": "2025-10-03T13:33:12+00:00",
"source_file": "lessons/3-NeuralNetworks/03-Perceptron/Perceptron.ipynb",
"language_code": "nl"
}

View File

@ -13,7 +13,7 @@
"\n",
"> Denne notatboken er en del av [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners). Besøk repositoriet for et komplett sett med læringsmaterialer.\n",
"\n",
"Som vi har diskutert, lar perceptron deg løse **binære klassifiseringsproblemer**, altså å klassifisere input-eksempler i to klasser - vi kan kalle dem **positive** og **negative**.\n",
"Som vi har diskutert, lar perceptron deg løse **binære klassifiseringsproblemer**, altså å klassifisere innspilleksempler i to klasser - vi kan kalle dem **positive** og **negative**.\n",
"\n",
"Først, la oss importere noen nødvendige biblioteker.\n"
]
@ -47,9 +47,9 @@
}
},
"source": [
"## Leketilfelle\n",
"## Leketøysproblem\n",
"\n",
"La oss starte med et enkelt problem, der vi har to inngangsvariabler. For eksempel, innen medisin kan vi ønske å klassifisere svulster som godartede eller ondartede, avhengig av størrelse og alder.\n",
"La oss starte med et leketøysproblem, hvor vi har to inngangsfunksjoner. For eksempel, innen medisin kan vi ønske å klassifisere svulster som godartede eller ondartede, avhengig av størrelse og alder.\n",
"\n",
"Vi vil generere et tilfeldig klassifiseringsdatasett ved hjelp av `make_classification`-funksjonen fra SciKit Learn-biblioteket:\n"
]
@ -154,11 +154,11 @@
"source": [
"## Perceptron\n",
"\n",
"Siden perceptron er en binær klassifisator, vil utgangen for hver inngangsvektor $x$ være enten +1 eller -1, avhengig av klassen. Utgangen beregnes ved hjelp av formelen\n",
"Siden perceptron er en binær klassifikator, vil utgangen for hver inputvektor $x$ fra vår perceptron være enten +1 eller -1, avhengig av klassen. Utgangen beregnes ved hjelp av formelen\n",
"\n",
"$$y(\\mathbf{x}) = f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x})$$\n",
"\n",
"hvor $\\mathbf{w}$ er en vektvektor, og $f$ er en trinnaktiveringsfunksjon:\n",
"hvor $\\mathbf{w}$ er en vektvektor, og $f$ er en stegaktiveringsfunksjon:\n",
"$$\n",
"f(x) = \\begin{cases}\n",
" +1 & x \\geq 0 \\\\\n",
@ -166,7 +166,7 @@
" \\end{cases} \\\\\n",
"$$\n",
"\n",
"En generell lineær modell bør imidlertid også ha en bias, dvs. ideelt sett bør vi beregne $y$ som $y=f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}+\\mathbf{b})$. For å forenkle modellen vår kan vi fjerne denne bias-termen ved å legge til én ekstra dimensjon til inngangsfunksjonene våre, som alltid er lik 1:\n"
"En generell lineær modell bør imidlertid også ha en bias, dvs. ideelt sett bør vi beregne $y$ som $y=f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}+\\mathbf{b})$. For å forenkle modellen vår kan vi eliminere denne bias-termen ved å legge til én ekstra dimensjon til våre inputfunksjoner, som alltid er lik 1:\n"
]
},
{
@ -213,7 +213,7 @@
" * $t_{n} \\in \\{-1, +1\\}$ for henholdsvis negative og positive treningsprøver\n",
" * $\\mathcal{M}$ - et sett med feilklassifiserte eksempler\n",
" \n",
"Vi vil bruke prosessen **gradientnedstigning**. Med noen innledende tilfeldige vekter $\\mathbf{w}^{(0)}$, vil vi justere vektene på hvert trinn i treningen ved hjelp av gradienten til $E$:\n",
"Vi vil bruke prosessen **gradient descent**. Med noen initiale tilfeldige vekter $\\mathbf{w}^{(0)}$, vil vi justere vektene på hvert steg i treningen ved hjelp av gradienten til $E$:\n",
"\n",
"$$\\mathbf{w}^{\\tau + 1}=\\mathbf{w}^{\\tau} - \\eta \\nabla E(\\mathbf{w}) = \\mathbf{w}^{\\tau} + \\eta\\sum_{n \\in \\mathcal{M}}\\mathbf{x}_{n} t_{n}$$\n",
"\n",
@ -271,7 +271,9 @@
{
"cell_type": "markdown",
"metadata": {},
"source": []
"source": [
"La oss nå kjøre treningen på datasettet vårt:\n"
]
},
{
"cell_type": "code",
@ -311,7 +313,7 @@
"source": [
"Som du kan se, er den innledende nøyaktigheten rundt 50 %, men den øker raskt til høyere verdier nær 90 %.\n",
"\n",
"La oss visualisere hvordan klassene er separert. Klassifiseringsfunksjonen vår ser ut som $\\mathbf{w}^Tx$, og den er større enn 0 for én klasse, og mindre enn 0 for en annen. Dermed er klasseseparasjonslinjen definert av $\\mathbf{w}^Tx = 0$. Siden vi kun har to dimensjoner $x_0$ og $x_1$, vil ligningen for linjen være $w_0x_0+w_1x_1+w_2 = 0$ (husk at vi eksplisitt har definert en ekstra dimensjon $x_2=1$). La oss plotte denne linjen:\n"
"La oss visualisere hvordan klassene er separert. Vår klassifiseringsfunksjon ser ut som $\\mathbf{w}^Tx$, og den er større enn 0 for én klasse, og mindre enn 0 for en annen. Dermed er klasseseparasjonslinjen definert av $\\mathbf{w}^Tx = 0$. Siden vi kun har to dimensjoner $x_0$ og $x_1$, vil ligningen for linjen være $w_0x_0+w_1x_1+w_2 = 0$ (husk at vi eksplisitt har definert en ekstra dimensjon $x_2=1$). La oss plotte denne linjen:\n"
]
},
{
@ -377,9 +379,9 @@
}
},
"source": [
"## Evaluer på testdatasett\n",
"## Evaluer på testdatasettet\n",
"\n",
"I starten har vi satt av noe data til testdatasettet. La oss se hvor nøyaktig klassifiseringen vår er på dette testdatasettet. For å gjøre dette utvider vi også testdatasettet med en ekstra dimensjon, multipliserer med vektsmatrisen, og sørger for at den oppnådde verdien har samme fortegn som etiketten (+1 eller -1). Deretter summerer vi alle boolske verdier og deler på lengden av testprøven for å finne nøyaktigheten:\n"
"I starten satte vi til side noe data til testdatasettet. La oss se hvor nøyaktig klassifiseringen vår er på dette testdatasettet. For å gjøre dette utvider vi også testdatasettet med en ekstra dimensjon, multipliserer med vektsmatrisen, og sørger for at den oppnådde verdien har samme fortegn som etiketten (+1 eller -1). Deretter summerer vi alle boolske verdier og deler på lengden av testprøven for å finne nøyaktigheten:\n"
]
},
{
@ -420,7 +422,7 @@
"source": [
"## Observere treningsprosessen\n",
"\n",
"Vi har tidligere sett hvordan nøyaktigheten synker under trening. Det hadde vært interessant å se hvordan skillelinjen oppfører seg under treningen. Koden nedenfor vil visualisere alt på én graf, og du skal kunne flytte glidebryteren for å \"reise i tid\" gjennom treningsprosessen.\n"
"Vi har tidligere sett hvordan nøyaktigheten reduseres under trening. Det hadde vært interessant å se hvordan separasjonslinjen oppfører seg under treningen. Koden nedenfor vil visualisere alt på én graf, og du skal kunne flytte glidebryteren for å \"reise i tid\" gjennom treningsprosessen.\n"
]
},
{
@ -527,9 +529,9 @@
"source": [
"## Begrensninger ved Perceptron\n",
"\n",
"Som du har sett ovenfor, er perceptron en **lineær klassifiserer**. Den kan skille mellom to klasser godt hvis de er **lineært separerbare**, dvs. kan skilles med en rett linje. Hvis ikke, vil treningsprosessen for perceptron ikke konvergere.\n",
"Som du har sett ovenfor, er perceptron en **lineær klassifikator**. Den kan skille mellom to klasser godt hvis de er **lineært separerbare**, altså kan skilles med en rett linje. Hvis ikke, vil treningsprosessen for perceptron ikke konvergere.\n",
"\n",
"Et tydelig eksempel på et problem som ikke kan løses av en perceptron er det såkalte **XOR-problemet**. Vi ønsker at vår perceptron skal lære den boolske XOR-funksjonen, som har følgende sannhetstabell:\n",
"Et av de mest åpenbare eksemplene på et problem som ikke kan løses av en perceptron, er det såkalte **XOR-problemet**. Vi ønsker at vår perceptron skal lære den boolske XOR-funksjonen, som har følgende sannhetstabell:\n",
"\n",
"| | 0 | 1 |\n",
"|---|---|---|\n",
@ -603,17 +605,17 @@
}
},
"source": [
"Som du kan se fra grafen ovenfor, går nøyaktigheten aldri over 75 %, fordi det er umulig å tegne en rett linje som klarer å få alle mulige eksempler riktig.\n",
"Som du kan se fra grafen ovenfor, går nøyaktigheten aldri over 75 %, fordi det er umulig å tegne en rett linje som klarer å klassifisere alle eksemplene korrekt.\n",
"\n",
"XOR-problemet er et klassisk eksempel på begrensningene til perceptron, og det ble påpekt av Marvin Minsky og Seymour Papert i 1969 i deres bok [Perceptrons](https://en.wikipedia.org/wiki/Perceptrons_(book)). Denne observasjonen begrenset forskningen innen nevrale nettverk i nesten 10 år, selv om - og dette vil vi se i neste del av kurset vårt - flerlags perceptroner er fullt i stand til å løse slike problemer.\n",
"XOR-problemet er et klassisk eksempel på begrensningene til perceptronen, og det ble påpekt av Marvin Minsky og Seymour Papert i 1969 i deres bok [Perceptrons](https://en.wikipedia.org/wiki/Perceptrons_(book)). Denne observasjonen begrenset forskningen innen nevrale nettverk i nesten 10 år, selv om - og dette vil vi se i neste del av kurset vårt - flerlags perceptroner er fullt i stand til å løse slike problemer.\n",
"\n",
"## Kompleks Eksempel - MNIST\n",
"\n",
"Selv om perceptron ikke kan løse XOR-problemet, kan det løse mange mer komplekse problemer, som gjenkjenning av håndskrevne tegn.\n",
"Selv om perceptronen ikke kan løse XOR-problemet, kan den løse mange mer komplekse problemer, som gjenkjenning av håndskrevne tegn.\n",
"\n",
"Et datasett som ofte brukes når man lærer maskinlæring, kalles [MNIST](https://en.wikipedia.org/wiki/MNIST_database). Det ble opprettet av Modified National Institute of Standards and Technology og inneholder et treningssett med 60 000 håndskrevne sifre, samlet inn fra rundt 250 studenter og ansatte ved instituttet. Det finnes også et testdatasett med 10 000 sifre, samlet inn fra forskjellige individer.\n",
"\n",
"Alle sifrene er representert av gråtonede bilder med størrelse 28x28 piksler.\n",
"Alle sifrene er representert av gråtonede bilder med en størrelse 28x28 piksler.\n",
"\n",
"> MNIST-datasettet er tilgjengelig som en treningskonkurranse på [Kaggle](https://www.kaggle.com/c/digit-recognizer), et nettsted som arrangerer konkurranser og utfordringer innen maskinlæring. Når du lærer hvordan du klassifiserer MNIST-sifre, kan du sende inn løsningen din til Kaggle for å se hvordan den vurderes blant andre deltakere.\n",
"\n",
@ -732,7 +734,9 @@
{
"cell_type": "markdown",
"metadata": {},
"source": []
"source": [
"Vi vil starte med å forsøke å klassifisere mellom 0 og 1:\n"
]
},
{
"cell_type": "code",
@ -827,13 +831,13 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Vennligst merk hvor raskt nøyaktigheten nærmer seg nesten 100 %.\n",
"Vær oppmerksom på hvordan nøyaktigheten stiger til nesten 100 % veldig raskt.\n",
"\n",
"Vennligst flytt glidebryteren til en posisjon mot slutten av treningen, og observer vektmatrisen som er plottet til venstre. Denne matrisen vil hjelpe deg med å forstå hvordan perseptronen faktisk fungerer. Du kan se de høye vektverdiene i midten av feltet, som tilsvarer piksler som vanligvis er til stede for tallet 1, og lave negative verdier på sidene, hvor deler av tallet 0 befinner seg. Så, hvis tallet som presenteres for perseptronen faktisk er 1, vil midtdelen av det bli multiplisert med høye verdier, noe som gir et positivt resultat. Derimot, når perseptronen observerer 0, vil de tilsvarende pikslene bli multiplisert med negative tall.\n",
"Vennligst flytt glidebryteren til en posisjon mot slutten av treningen, og observer vektmatrisen som er plottet til venstre. Denne matrisen vil hjelpe deg å forstå hvordan perceptronen faktisk fungerer. Du kan se de høye vektverdiene i midten av feltet, som tilsvarer piksler som vanligvis er til stede for sifferet 1, og lave negative verdier på sidene, der deler av sifferet 0 er. Så, hvis sifferet som presenteres for perceptronen faktisk er 1, vil midtdelen av det bli multiplisert med høye verdier, noe som gir et positivt resultat. Derimot, når perceptronen observerer 0, vil de tilsvarende pikslene bli multiplisert med negative tall.\n",
"\n",
"> Du kan legge merke til at hvis vi gir perseptronen et tall 1 som er litt forskjøvet horisontalt, slik at pikslene opptar plassen der de vertikale delene av 0 er, kan vi få et feil resultat. Siden MNIST-datasettet vårt er slik at alle tall er sentrert og riktig posisjonert, stoler perseptronen på dette for å skille mellom tallene.\n",
"> Du kan legge merke til at hvis vi gir vår perceptron et siffer 1 som er litt forskjøvet horisontalt, slik at pikslene opptar plassen der det er vertikale deler av 0, kan vi få et feil resultat. Siden MNIST-datasettet vårt er slik at alle sifre er sentrert og posisjonert riktig, er perceptronen avhengig av dette for å skille mellom sifrene.\n",
"\n",
"La oss nå prøve forskjellige tall:\n"
"La oss nå prøve forskjellige sifre:\n"
]
},
{
@ -909,11 +913,11 @@
"source": [
"## Diskusjon\n",
"\n",
"Av en eller annen grunn er 2 og 5 ikke lett å skille fra hverandre. Selv om vi oppnår relativt høy nøyaktighet (over 85 %), kan vi tydelig se hvordan perceptronen slutter å lære på et tidspunkt.\n",
"Av en eller annen grunn er 2 og 5 ikke like lett å skille fra hverandre. Selv om vi oppnår relativt høy nøyaktighet (over 85 %), kan vi tydelig se hvordan perceptronen slutter å lære på et tidspunkt.\n",
"\n",
"For å forstå hvorfor dette skjer, kan vi prøve å bruke [Principal Component Analysis](https://en.wikipedia.org/wiki/Principal_component_analysis) (PCA). Det er en maskinlæringsteknikk som brukes til å redusere dimensjonaliteten i input-datasettet, på en måte som gir best mulig separasjon mellom klassene.\n",
"For å forstå hvorfor dette skjer, kan vi prøve å bruke [Principal Component Analysis](https://en.wikipedia.org/wiki/Principal_component_analysis) (PCA). Det er en maskinlæringsteknikk som brukes til å redusere dimensjonaliteten til inngangsdatamengden, på en måte som gir best mulig separasjon mellom klassene.\n",
"\n",
"I vårt tilfelle har et input-bilde 784 piksler (input-funksjoner), og vi ønsker å bruke PCA for å redusere antall parametere til bare 2, slik at vi kan plotte dem på en graf. Disse to parameterne vil være en lineær kombinasjon av de opprinnelige funksjonene, og vi kan se på denne prosedyren som en \"rotasjon\" av vårt opprinnelige 784-dimensjonale rom og observere projeksjonen til vårt 2D-rom, inntil vi får den beste visningen som skiller klassene.\n"
"I vårt tilfelle har et inngangsbilde 784 piksler (inngangsfunksjoner), og vi ønsker å bruke PCA for å redusere antall parametere til bare 2, slik at vi kan plotte dem på en graf. Disse to parameterne vil være en lineær kombinasjon av de opprinnelige funksjonene, og vi kan se på denne prosedyren som en \"rotasjon\" av vårt opprinnelige 784-dimensjonale rom og observere projeksjonen til vårt 2D-rom, inntil vi får den beste visningen som skiller klassene.\n"
]
},
{
@ -1023,17 +1027,17 @@
}
},
"source": [
"Som du kan se, kan 0 og 1 tydelig skilles med en rett linje. Dette indikerer at i det opprinnelige 784-dimensjonale rommet er punktene som tilsvarer sifrene også lineært separerbare. Når det gjelder 2 og 5, kan vi ikke finne en god projeksjon som skiller sifrene klart, og derfor oppstår det noen tilfeller av feil klassifisering.\n",
"Som du kan se, kan 0 og 1 tydelig skilles med en rett linje. Dette indikerer at i det opprinnelige 784-dimensjonale rommet er punktene som tilsvarer sifrene også lineært separerbare. Når det gjelder 2 og 5, kan vi ikke finne en god projeksjon som skiller sifrene tydelig, og derfor oppstår det noen tilfeller av feil klassifisering.\n",
"\n",
"> Senere i dette kurset vil vi lære hvordan vi kan lage ikke-lineære klassifikatorer ved hjelp av nevrale nettverk, og hvordan vi kan håndtere problemet med sifre som ikke er riktig justert. Veldig snart vil vi oppnå over 99 % nøyaktighet i MNIST-sifferklassifisering, samtidig som vi klassifiserer dem i 10 forskjellige klasser.\n",
"> Senere i dette kurset vil vi lære hvordan vi kan lage ikke-lineære klassifikatorer ved hjelp av nevrale nettverk, og hvordan vi kan håndtere problemet med sifre som ikke er riktig justert. Veldig snart vil vi oppnå over 99 % nøyaktighet i MNIST-sifferklassifisering, mens vi klassifiserer dem i 10 forskjellige klasser.\n",
"\n",
"## Oppsummering\n",
"\n",
" * Vi har lært om den enkleste nevrale nettverksarkitekturen ettlags perceptron.\n",
" * Vi har implementert perceptronet \"for hånd\", ved å bruke en enkel treningsprosedyre basert på gradientnedstigning.\n",
" * Til tross for enkelheten kan ettlags perceptron løse ganske komplekse problemer med håndskrevet siffergjenkjenning.\n",
" * Ettlags perceptron er en lineær klassifikator, og gir derfor samme klassifiseringsevne som logistisk regresjon.\n",
" * I funksjonsrommet kan perceptronet skille to klasser av inndata ved hjelp av et hyperplan.\n"
" * Vi har lært om den enkleste nevrale nettverksarkitekturen - én-lags perceptron.\n",
" * Vi har implementert perceptron \"for hånd\", ved å bruke en enkel treningsprosedyre basert på gradientnedstigning.\n",
" * Til tross for enkelheten kan én-lags perceptron løse ganske komplekse problemer med håndskrevet siffergjenkjenning.\n",
" * Én-lags perceptron er en lineær klassifikator, og gir derfor samme klassifiseringskraft som logistisk regresjon.\n",
" * I prøverommet kan perceptron skille to klasser av inputdata ved hjelp av et hyperplan.\n"
]
},
{
@ -1042,14 +1046,14 @@
"source": [
"## Kreditering\n",
"\n",
"Denne notatboken er en del av [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners), og er utarbeidet av [Dmitry Soshnikov](http://soshnikov.com). Den er inspirert av Neural Network Workshop ved Microsoft Research Cambridge. Noe kode og illustrerende materiale er hentet fra presentasjoner av [Katja Hoffmann](https://www.microsoft.com/en-us/research/people/kahofman/), [Matthew Johnson](https://www.microsoft.com/en-us/research/people/matjoh/) og [Ryoto Tomioka](https://www.microsoft.com/en-us/research/people/ryoto/), samt fra [NeuroWorkshop](http://github.com/shwars/NeuroWorkshop)-repositoryen.\n"
"Denne notatboken er en del av [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners), og er utarbeidet av [Dmitry Soshnikov](http://soshnikov.com). Den er inspirert av Neural Network Workshop ved Microsoft Research Cambridge. Noe kode og illustrerende materiale er hentet fra presentasjoner av [Katja Hoffmann](https://www.microsoft.com/en-us/research/people/kahofman/), [Matthew Johnson](https://www.microsoft.com/en-us/research/people/matjoh/) og [Ryoto Tomioka](https://www.microsoft.com/en-us/research/people/ryoto/), samt fra [NeuroWorkshop](http://github.com/shwars/NeuroWorkshop)-repositoryet.\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Ansvarsfraskrivelse**: \nDette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi tilstreber nøyaktighet, vær oppmerksom på at automatiske oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen.\n"
"\n---\n\n**Ansvarsfraskrivelse**: \nDette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi tilstreber nøyaktighet, vær oppmerksom på at automatiserte oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen.\n"
]
}
],
@ -1078,8 +1082,8 @@
"start_slideshow_at": "selected"
},
"coopTranslator": {
"original_hash": "914fc55f59efc7e17b8130d4033ac617",
"translation_date": "2025-08-29T08:33:35+00:00",
"original_hash": "d67e5b54ba20b507aa88d71aa3d042d8",
"translation_date": "2025-10-03T13:31:21+00:00",
"source_file": "lessons/3-NeuralNetworks/03-Perceptron/Perceptron.ipynb",
"language_code": "no"
}

View File

@ -11,11 +11,11 @@
"source": [
"## ਪਰਸੈਪਟ੍ਰਾਨ\n",
"\n",
"> ਇਹ ਨੋਟਬੁੱਕ [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners) ਦਾ ਹਿੱਸਾ ਹੈ। ਪੂਰੇ ਸਿੱਖਣ ਸਮੱਗਰੀ ਦੇ ਸੈੱਟ ਲਈ ਰਿਪੋਜ਼ਟਰੀ ਵੇਖੋ।\n",
"> ਇਹ ਨੋਟਬੁੱਕ [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners) ਦਾ ਹਿੱਸਾ ਹੈ। ਪੂਰੇ ਸਿੱਖਣ ਸਮੱਗਰੀ ਦੇ ਸੈੱਟ ਲਈ ਰਿਪੋਜ਼ਟਰੀ 'ਤੇ ਜਾਓ।\n",
"\n",
"ਜਿਵੇਂ ਕਿ ਅਸੀਂ ਚਰਚਾ ਕੀਤੀ ਹੈ, ਪਰਸੈਪਟ੍ਰਾਨ ਤੁਹਾਨੂੰ **ਬਾਈਨਰੀ ਕਲਾਸੀਫਿਕੇਸ਼ਨ ਸਮੱਸਿਆ** ਹੱਲ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ, ਅਰਥਾਤ, ਇਨਪੁਟ ਉਦਾਹਰਣਾਂ ਨੂੰ ਦੋ ਵਰਗਾਂ ਵਿੱਚ ਵੰਡਣਾ - ਅਸੀਂ ਉਨ੍ਹਾਂ ਨੂੰ **ਪੌਜ਼ਿਟਿਵ** ਅਤੇ **ਨੈਗਟਿਵ** ਕਹਿ ਸਕਦੇ ਹਾਂ।\n",
"ਜਿਵੇਂ ਕਿ ਅਸੀਂ ਚਰਚਾ ਕੀਤੀ ਹੈ, ਪਰਸੈਪਟ੍ਰਾਨ ਤੁਹਾਨੂੰ **ਦੁਵਿਅਕ ਵਰਗੀਕਰਨ ਸਮੱਸਿਆ** ਹੱਲ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ, ਅਰਥਾਤ ਇਨਪੁਟ ਉਦਾਹਰਣਾਂ ਨੂੰ ਦੋ ਵਰਗਾਂ ਵਿੱਚ ਵਰਗੀਕ੍ਰਿਤ ਕਰਨ ਲਈ - ਅਸੀਂ ਉਨ੍ਹਾਂ ਨੂੰ **ਸਕਾਰਾਤਮਕ** ਅਤੇ **ਨਕਾਰਾਤਮਕ** ਕਹਿ ਸਕਦੇ ਹਾਂ।\n",
"\n",
"ਸਭ ਤੋਂ ਪਹਿਲਾਂ, ਆਓ ਕੁਝ ਲੋੜੀਂਦੀਆਂ ਲਾਇਬ੍ਰੇਰੀਆਂ ਇੰਪੋਰਟ ਕਰੀਏ।\n"
"ਸਭ ਤੋਂ ਪਹਿਲਾਂ, ਆਓ ਕੁਝ ਲੋੜੀਂਦੇ ਲਾਇਬ੍ਰੇਰੀਆਂ ਇਮਪੋਰਟ ਕਰੀਏ।\n"
]
},
{
@ -47,11 +47,11 @@
}
},
"source": [
"## ਖਿੌਣਾ ਸਮੱਸਿਆ\n",
"## ਖਿੌਣਾ ਸਮੱਸਿਆ\n",
"\n",
"ਚਲੋ ਸ਼ੁਰੂਆਤ ਇੱਕ ਖਿਡੌਣਾ ਸਮੱਸਿਆ ਨਾਲ ਕਰੀਏ, ਜਿੱਥੇ ਸਾਡੇ ਕੋਲ ਦੋ ਇਨਪੁਟ ਫੀਚਰ ਹਨ। ਉਦਾਹਰ ਵਜੋਂ, ਦਵਾਈ ਵਿੱਚ ਅਸੀਂ ਟਿਊਮਰਾਂ ਨੂੰ ਸਾਈਜ਼ ਅਤੇ ਉਮਰ ਦੇ ਆਧਾਰ 'ਸਹੀਮ' ਅਤੇ 'ਘਾਤਕ' ਵਿੱਚ ਵੰਡਣਾ ਚਾਹੁੰਦੇ ਹਾਂ।\n",
"ਸਭ ਤੋਂ ਪਹਿਲਾਂ, ਆਓ ਇੱਕ ਖਿਲੌਣਾ ਸਮੱਸਿਆ ਨਾਲ ਸ਼ੁਰੂ ਕਰੀਏ, ਜਿੱਥੇ ਸਾਡੇ ਕੋਲ ਦੋ ਇਨਪੁਟ ਫੀਚਰ ਹਨ। ਉਦਾਹਰ ਵਜੋਂ, ਦਵਾਈ ਵਿੱਚ ਅਸੀਂ ਟਿਊਮਰਾਂ ਨੂੰ ਸਾਈਜ਼ ਅਤੇ ਉਮਰ ਦੇ ਆਧਾਰ 'ਬਿਨਾਈਨ' ਅਤੇ 'ਮੈਲਿਗਨੈਂਟ' ਵਿੱਚ ਵੰਡਣਾ ਚਾਹੁੰਦੇ ਹਾਂ।\n",
"\n",
"ਅਸੀਂ SciKit Learn ਲਾਇਬ੍ਰੇਰੀ ਦ `make_classification` ਫੰਕਸ਼ਨ ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਇੱਕ ਰੈਂਡਮ ਕਲਾਸੀਫਿਕੇਸ਼ਨ ਡੇਟਾਸੈੱਟ ਤਿਆਰ ਕਰਾਂਗੇ:\n"
"ਅਸੀਂ SciKit Learn ਲਾਇਬ੍ਰੇਰੀ ਦ `make_classification` ਫੰਕਸ਼ਨ ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਇੱਕ ਰੈਂਡਮ ਕਲਾਸੀਫਿਕੇਸ਼ਨ ਡਾਟਾਸੈਟ ਬਣਾਵਾਂਗੇ:\n"
]
},
{
@ -95,7 +95,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"ਆਓ ਡੇਟਾਸੈਟ ਨੂੰ ਵੀ ਪਲਾਟ ਕਰੀਏ:\n"
"ਆਓ ਡੇਟਾਸੈਟ ਨੂੰ ਵੀ ਪਲਾਟ ਕਰੀਏ:\n"
]
},
{
@ -154,7 +154,7 @@
"source": [
"## ਪਰਸੈਪਟ੍ਰਾਨ\n",
"\n",
"ਕਿਉਂਕਿ ਪਰਸੈਪਟ੍ਰਾਨ ਇੱਕ ਬਾਈਨਰੀ ਕਲਾਸੀਫਾਇਰ ਹੈ, ਹਰ ਇਨਪੁਟ ਵੇਕਟਰ $x$ ਲਈ ਸਾਡੇ ਪਰਸੈਪਟ੍ਰਾਨ ਦਾ ਆਉਟਪੁਟ +1 ਜਾਂ -1 ਹੋਵੇਗਾ, ਕਲਾਸ ਦੇ ਅਧਾਰ 'ਤੇ। ਆਉਟਪੁਟ ਹੇਠਾਂ ਦਿੱਤੇ ਫਾਰਮੂਲੇ ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਗਣਨਾ ਕੀਤੀ ਜਾਵੇਗੀ:\n",
"ਕਿਉਂਕਿ ਪਰਸੈਪਟ੍ਰਾਨ ਇੱਕ ਬਾਈਨਰੀ ਕਲਾਸੀਫਾਇਰ ਹੈ, ਹਰ ਇਨਪੁਟ ਵੇਕਟਰ $x$ ਲਈ ਸਾਡੇ ਪਰਸੈਪਟ੍ਰਾਨ ਦਾ ਆਉਟਪੁਟ +1 ਜਾਂ -1 ਹੋਵੇਗਾ, ਜੋ ਕਲਾਸ 'ਤੇ ਨਿਰਭਰ ਕਰਦਾ ਹੈ। ਆਉਟਪੁਟ ਹੇਠਾਂ ਦਿੱਤੇ ਫਾਰਮੂਲੇ ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਗਣਨਾ ਕੀਤੀ ਜਾਵੇਗੀ:\n",
"\n",
"$$y(\\mathbf{x}) = f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x})$$\n",
"\n",
@ -166,7 +166,7 @@
" \\end{cases} \\\\\n",
"$$\n",
"\n",
"ਹਾਲਾਂਕਿ, ਇੱਕ ਜਨਰਲ ਲੀਨੀਅਰ ਮਾਡਲ ਵਿੱਚ ਬਾਇਸ ਵੀ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ, ਅਰਥਾਤ ਆਦਰਸ਼ ਤੌਰ 'ਤੇ ਸਾਨੂੰ $y$ ਨੂੰ $y=f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}+\\mathbf{b})$ ਵਜੋਂ ਗਣਨਾ ਕਰਨੀ ਚਾਹੀਦੀ ਹੈ। ਸਾਡੇ ਮਾਡਲ ਨੂੰ ਸਧਾਰਨ ਬਣਾਉਣ ਲਈ, ਅਸੀਂ ਇਸ ਬਾਇਸ ਟਰਮ ਨੂੰ ਹਟਾ ਸਕਦੇ ਹਾਂ ਜਦੋਂ ਅਸੀਂ ਆਪਣੇ ਇਨਪੁਟ ਫੀਚਰਜ਼ ਵਿੱਚ ਇੱਕ ਹੋਰ ਡਾਇਮੈਂਸ਼ਨ ਸ਼ਾਮਲ ਕਰਦੇ ਹਾਂ, ਜੋ ਹਮੇਸ਼ਾ 1 ਦੇ ਬਰਾਬਰ ਹੁੰਦਾ ਹੈ:\n"
"ਹਾਲਾਂਕਿ, ਇੱਕ ਜਨਰਲ ਲੀਨੀਅਰ ਮਾਡਲ ਵਿੱਚ ਇੱਕ ਬਾਇਸ ਵੀ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ, ਅਰਥਾਤ ਆਦਰਸ਼ ਤੌਰ 'ਤੇ ਸਾਨੂੰ $y$ ਨੂੰ $y=f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}+\\mathbf{b})$ ਵਜੋਂ ਗਣਨਾ ਕਰਨੀ ਚਾਹੀਦੀ ਹੈ। ਆਪਣੇ ਮਾਡਲ ਨੂੰ ਸਧਾਰਨ ਬਣਾਉਣ ਲਈ, ਅਸੀਂ ਇਸ ਬਾਇਸ ਟਰਮ ਨੂੰ ਹਟਾ ਸਕਦੇ ਹਾਂ ਜ ਅਸੀਂ ਆਪਣੇ ਇਨਪੁਟ ਫੀਚਰਜ਼ ਵਿੱਚ ਇੱਕ ਹੋਰ ਡਾਈਮੇਂਸ਼ਨ ਸ਼ਾਮਲ ਕਰ ਲਈਏ, ਜੋ ਹਮੇਸ਼ਾਂ 1 ਦੇ ਬਰਾਬਰ ਹੁੰਦੀ ਹੈ:\n"
]
},
{
@ -204,22 +204,22 @@
}
},
"source": [
"## ਟ੍ਰੇਨਿੰਗ ਐਲਗੋਰਿਮ\n",
"## ਟ੍ਰੇਨਿੰਗ ਐਲਗੋਰਿਮ\n",
"\n",
"ਪਰਸੈਪਟ੍ਰਾਨ ਨੂੰ ਟ੍ਰੇਨ ਕਰਨ ਲਈ, ਸਾਨੂੰ $\\mathbf{w}$ ਵਜ਼ਨ ਲੱਭਣੇ ਪੈਣਗੇ ਜੋ ਗਲਤੀ ਨੂੰ ਘਟਾਉਣਗੇ। ਗਲਤੀ ਨੂੰ **ਪਰਸੈਪਟ੍ਰਾਨ ਮਾਪਦੰਡ** ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਪਰਿਭਾਸ਼ਿਤ ਕੀਤਾ ਜਾਂਦਾ ਹੈ:\n",
"ਪਰਸੈਪਟ੍ਰਾਨ ਨੂੰ ਟ੍ਰੇਨ ਕਰਨ ਲਈ, ਸਾਨੂੰ ਉਹ ਵਜ਼ਨ $\\mathbf{w}$ ਲੱਭਣੇ ਪੈਣਗੇ ਜੋ ਗਲਤੀ ਨੂੰ ਘਟਾਉਣਗੇ। ਗਲਤੀ ਨੂੰ **ਪਰਸੈਪਟ੍ਰਾਨ ਮਾਪਦੰਡ** ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਪਰਿਭਾਸ਼ਿਤ ਕੀਤਾ ਜਾਂਦਾ ਹੈ:\n",
"\n",
"$$E(\\mathbf{w}) = -\\sum_{n \\in \\mathcal{M}}\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}_{n}t_{n}$$\n",
" \n",
" * $t_{n} \\in \\{-1, +1\\}$ ਨਕਾਰਾਤਮਕ ਅਤੇ ਸਕਾਰਾਤਮਕ ਟ੍ਰੇਨਿੰਗ ਨਮੂਨਿਆਂ ਲਈ, ਅਨੁਕ੍ਰਮਵਾਰ\n",
" * $t_{n} \\in \\{-1, +1\\}$ ਨਕਾਰਾਤਮਕ ਅਤੇ ਸਕਾਰਾਤਮਕ ਟ੍ਰੇਨਿੰਗ ਨਮੂਨਿਆਂ ਲਈ, ਕ੍ਰਮਵਾਰ\n",
" * $\\mathcal{M}$ - ਗਲਤ ਵਰਗੀਕ੍ਰਿਤ ਉਦਾਹਰਣਾਂ ਦਾ ਸੈੱਟ\n",
" \n",
"ਅਸੀਂ **ਗ੍ਰੇਡੀਅੰਟ ਡਿਸੈਂਟ** ਦੀ ਪ੍ਰਕਿਰਿਆ ਦੀ ਵਰਤੋਂ ਕਰਾਂਗੇ। ਕੁਝ ਸ਼ੁਰੂਆਤੀ ਰੈਂਡਮ ਵਜ਼ਨਾਂ $\\mathbf{w}^{(0)}$ ਨਾਲ ਸ਼ੁਰੂ ਕਰਦੇ ਹੋਏ, ਅਸੀਂ ਟ੍ਰੇਨਿੰਗ ਦੇ ਹਰ ਕਦਮ 'ਤੇ ਗਲਤੀ $E$ ਦੇ ਗ੍ਰੇਡੀਅੰਟ ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਵਜ਼ਨਾਂ ਨੂੰ ਢਾਲਾਂਗੇ:\n",
"ਅਸੀਂ **ਗ੍ਰੇਡੀਅੰਟ ਡਿਸੈਂਟ** ਦੀ ਪ੍ਰਕਿਰਿਆ ਦੀ ਵਰਤੋਂ ਕਰਾਂਗੇ। ਕੁਝ ਸ਼ੁਰੂਆਤੀ ਰੈਂਡਮ ਵਜ਼ਨਾਂ $\\mathbf{w}^{(0)}$ ਨਾਲ ਸ਼ੁਰੂ ਕਰਦੇ ਹੋਏ, ਅਸੀਂ ਟ੍ਰੇਨਿੰਗ ਦੇ ਹਰ ਕਦਮ 'ਤੇ ਗਲਤੀ $E$ ਦੇ ਗ੍ਰੇਡੀਅੰਟ ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਵਜ਼ਨਾਂ ਨੂੰ ਠੀਕ ਕਰਾਂਗੇ:\n",
"\n",
"$$\\mathbf{w}^{\\tau + 1}=\\mathbf{w}^{\\tau} - \\eta \\nabla E(\\mathbf{w}) = \\mathbf{w}^{\\tau} + \\eta\\sum_{n \\in \\mathcal{M}}\\mathbf{x}_{n} t_{n}$$\n",
"\n",
"ਜਿੱਥੇ $\\eta$ ਇੱਕ **ਲਰਨਿੰਗ ਰੇਟ** ਹੈ, ਅਤੇ $\\tau\\in\\mathbb{N}$ - ਇਟਰੇਸ਼ਨ ਦੀ ਗਿਣਤੀ।\n",
"\n",
"ਆਓ ਇਸ ਐਲਗੋਰਿਮ ਨੂੰ Python ਵਿੱਚ ਪਰਿਭਾਸ਼ਿਤ ਕਰੀਏ:\n"
"ਆਓ ਇਸ ਐਲਗੋਰਿਮ ਨੂੰ Python ਵਿੱਚ ਪਰਿਭਾਸ਼ਿਤ ਕਰੀਏ:\n"
]
},
{
@ -271,7 +271,9 @@
{
"cell_type": "markdown",
"metadata": {},
"source": []
"source": [
"ਹੁਣ ਆਓ ਆਪਣੇ ਡੇਟਾਸੈੱਟ 'ਤੇ ਟ੍ਰੇਨਿੰਗ ਚਲਾਈਏ:\n"
]
},
{
"cell_type": "code",
@ -309,9 +311,9 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"ਜਿਵੇਂ ਤੁਸੀਂ ਦੇਖ ਸਕਦੇ ਹੋ, ਸ਼ੁਰੂਆਤੀ ਸਹੀਤਾ ਲਗਭਗ 50% ਹੈ, ਪਰ ਇਹ ਤੇਜ਼ੀ ਨਾਲ ਵਧ ਕੇ 90% ਦੇ ਨੇੜੇ ਉੱਚ ਮੁੱਲਾਂ ਤੱਕ ਪਹੁੰਚ ਜਾਂਦੀ ਹੈ।\n",
"ਜਿਵੇਂ ਤੁਸੀਂ ਦੇਖ ਸਕਦੇ ਹੋ, ਸ਼ੁਰੂਆਤੀ ਸਹੀਤਾ ਲਗਭਗ 50% ਹੈ, ਪਰ ਇਹ ਜਲਦੀ ਹੀ ਵਧ ਕੇ 90% ਦੇ ਨੇੜੇ ਪਹੁੰਚ ਜਾਂਦੀ ਹੈ।\n",
"\n",
"ਆਓ ਵੇਖੀਏ ਕਿ ਕਿਵੇਂ ਕਲਾਸਾਂ ਨੂੰ ਵੱਖਰਾ ਕੀਤਾ ਜਾਂਦਾ ਹੈ। ਸਾਡਾ ਵਰਗੀਕਰਨ ਫੰਕਸ਼ਨ $\\mathbf{w}^Tx$ ਵਰਗਾ ਹੈ, ਅਤੇ ਇਹ ਇੱਕ ਕਲਾਸ ਲਈ 0 ਤੋਂ ਵੱਧ ਹੈ, ਅਤੇ ਦੂਜੇ ਲਈ 0 ਤੋਂ ਘੱਟ। ਇਸ ਤਰ੍ਹਾਂ, ਕਲਾਸ ਵੱਖਰਨ ਦੀ ਰੇਖਾ $\\mathbf{w}^Tx = 0$ ਦੁਆਰਾ ਪਰਿਭਾਸ਼ਿਤ ਕੀਤੀ ਜਾਂਦੀ ਹੈ। ਕਿਉਂਕਿ ਸਾਡੇ ਕੋਲ ਸਿਰਫ ਦੋ ਡਾਈਮੇਂਸ਼ਨ ਹਨ $x_0$ ਅਤੇ $x_1$, ਰੇਖਾ ਲਈ ਸਮੀਕਰਨ $w_0x_0+w_1x_1+w_2 = 0$ ਹੋਵੇਗਾ (ਯਾਦ ਕਰੋ ਕਿ ਅਸੀਂ ਸਪਸ਼ਟ ਤੌਰ 'ਤੇ ਇੱਕ ਵਾਧੂ ਡਾਈਮੇਂਸ਼ਨ $x_2=1$ ਪਰਿਭਾਸ਼ਿਤ ਕੀਤਾ ਹੈ)। ਆਓ ਇਸ ਰੇਖਾ ਨੂੰ ਪਲਾਟ ਕਰੀਏ:\n"
"ਆਓ ਵੇਖੀਏ ਕਿ ਕਿਵੇਂ ਕਲਾਸਾਂ ਨੂੰ ਵੱਖ ਕੀਤਾ ਜਾਂਦਾ ਹੈ। ਸਾਡਾ ਵਰਗੀਕਰਨ ਫੰਕਸ਼ਨ $\\mathbf{w}^Tx$ ਵਰਗਾ ਹੈ, ਅਤੇ ਇਹ ਇੱਕ ਕਲਾਸ ਲਈ 0 ਤੋਂ ਵੱਧ ਹੈ, ਅਤੇ ਦੂਜੇ ਲਈ 0 ਤੋਂ ਘੱਟ। ਇਸ ਤਰ੍ਹਾਂ, ਕਲਾਸ ਵੱਖ ਕਰਨ ਵਾਲੀ ਲਾਈਨ $\\mathbf{w}^Tx = 0$ ਦੁਆਰਾ ਪਰਿਭਾਸ਼ਿਤ ਕੀਤੀ ਜਾਂਦੀ ਹੈ। ਕਿਉਂਕਿ ਸਾਡੇ ਕੋਲ ਸਿਰਫ ਦੋ ਮਾਪ $x_0$ ਅਤੇ $x_1$ ਹਨ, ਲਾਈਨ ਲਈ ਸਮੀਕਰਨ $w_0x_0+w_1x_1+w_2 = 0$ ਹੋਵੇਗਾ (ਯਾਦ ਰੱਖੋ ਕਿ ਅਸੀਂ ਖੁਦ ਇੱਕ ਵਾਧੂ ਮਾਪ $x_2=1$ ਪਰਿਭਾਸ਼ਿਤ ਕੀਤਾ ਹੈ)। ਆਓ ਇਸ ਲਾਈਨ ਨੂੰ ਪਲਾਟ ਕਰੀਏ:\n"
]
},
{
@ -379,7 +381,7 @@
"source": [
"## ਟੈਸਟ ਡੇਟਾਸੈੱਟ 'ਤੇ ਮੁਲਾਂਕਨ ਕਰੋ\n",
"\n",
"ਸ਼ੁਰੂ ਵਿੱਚ, ਅਸੀਂ ਕੁਝ ਡੇਟਾ ਨੂੰ ਟੈਸਟ ਡੇਟਾਸੈੱਟ ਲਈ ਅਲੱਗ ਕੀਤਾ ਸੀ। ਆਓ ਵੇਖੀਏ ਕਿ ਸਾਡਾ ਕਲਾਸੀਫਾਇਰ ਇਸ ਟੈਸਟ ਡੇਟਾਸੈੱਟ 'ਤੇ ਕਿੰਨਾ ਸਹੀ ਹੈ। ਇਹ ਕਰਨ ਲਈ, ਅਸੀਂ ਟੈਸਟ ਡੇਟਾਸੈੱਟ ਵਿੱਚ ਇੱਕ ਵਾਧੂ ਡਾਇਮੈਂਸ਼ਨ ਸ਼ਾਮਲ ਕਰਦੇ ਹਾਂ, ਵਜ਼ਨ ਮੈਟ੍ਰਿਕਸ ਨਾਲ ਗੁਣਾ ਕਰਦੇ ਹਾਂ, ਅਤੇ ਇਹ ਯਕੀਨੀ ਬਣਾਉਂਦੇ ਹਾਂ ਕਿ ਪ੍ਰਾਪਤ ਕੀਤੀ ਗਈ ਮੁੱਲ ਲੇਬਲ (+1 ਜਾਂ -1) ਦੇ ਸਮਾਨ ਚਿੰਨ੍ਹ ਦੀ ਹੈ। ਫਿਰ ਅਸੀਂ ਸਾਰੇ ਬੂਲੀਅਨ ਮੁੱਲਾਂ ਨੂੰ ਇਕੱਠਾ ਕਰਦੇ ਹਾਂ ਅਤੇ ਟੈਸਟ ਨਮੂਨੇ ਦੀ ਲੰਬਾਈ ਨਾਲ ਵੰਡਦੇ ਹਾਂ, ਸਹੀਤਾ ਪ੍ਰਾਪਤ ਕਰਨ ਲਈ:\n"
"ਸ਼ੁਰੂ ਵਿੱਚ, ਅਸੀਂ ਕੁਝ ਡੇਟਾ ਨੂੰ ਟੈਸਟ ਡੇਟਾਸੈੱਟ ਲਈ ਅਲੱਗ ਕੀਤਾ ਸੀ। ਆਓ ਵੇਖੀਏ ਕਿ ਸਾਡਾ ਕਲਾਸੀਫਾਇਰ ਇਸ ਟੈਸਟ ਡੇਟਾਸੈੱਟ 'ਤੇ ਕਿੰਨਾ ਸਹੀ ਹੈ। ਇਹ ਕਰਨ ਲਈ, ਅਸੀਂ ਟੈਸਟ ਡੇਟਾਸੈੱਟ ਨੂੰ ਇੱਕ ਵਾਧੂ ਡਾਇਮੈਂਸ਼ਨ ਨਾਲ ਵਧਾਉਂਦੇ ਹਾਂ, ਵਜ਼ਨ ਮੈਟ੍ਰਿਕਸ ਨਾਲ ਗੁਣਾ ਕਰਦੇ ਹਾਂ, ਅਤੇ ਇਹ ਯਕੀਨੀ ਬਣਾਉਂਦੇ ਹਾਂ ਕਿ ਪ੍ਰਾਪਤ ਕੀਤੀ ਗਈ ਮੁੱਲ ਲੇਬਲ (+1 ਜਾਂ -1) ਦੇ ਸਮਾਨ ਚਿੰਨ੍ਹ ਦੀ ਹੈ। ਫਿਰ ਅਸੀਂ ਸਾਰੇ ਬੂਲੀਅਨ ਮੁੱਲਾਂ ਨੂੰ ਜੋੜਦੇ ਹਾਂ ਅਤੇ ਟੈਸਟ ਨਮੂਨੇ ਦੀ ਲੰਬਾਈ ਨਾਲ ਵੰਡਦੇ ਹਾਂ, ਸਹੀਤਾ ਪ੍ਰਾਪਤ ਕਰਨ ਲਈ:\n"
]
},
{
@ -420,7 +422,7 @@
"source": [
"## ਟ੍ਰੇਨਿੰਗ ਪ੍ਰਕਿਰਿਆ ਨੂੰ ਦੇਖਣਾ\n",
"\n",
"ਅਸੀਂ ਪਹਿਲਾਂ ਵੇਖਿਆ ਹੈ ਕਿ ਟ੍ਰੇਨਿੰਗ ਦੌਰਾਨ ਸਹੀਤਾ ਕਿਵੇਂ ਘਟਦੀ ਹੈ। ਇਹ ਦੇਖਣਾ ਚੰਗਾ ਹੋਵੇਗਾ ਕਿ ਟ੍ਰੇਨਿੰਗ ਦੌਰਾਨ ਵੱਖਰੇ ਕਰਨ ਵਾਲੀ ਰੇਖਾ ਕਿਵੇਂ ਬਦਲਦੀ ਹੈ। ਹੇਠਾਂ ਦਿੱਤਾ ਕੋਡ ਸਭ ਕੁਝ ਇੱਕ ਗ੍ਰਾਫ 'ਤੇ ਦਿਖਾਵੇਗਾ, ਅਤੇ ਤੁਸੀਂ ਸਲਾਈਡਰ ਨੂੰ ਹਿਲਾ ਕੇ ਟ੍ਰੇਨਿੰਗ ਪ੍ਰਕਿਰਿਆ ਵਿੱਚ \"ਸਮੇਂ ਦੀ ਯਾਤਰਾ\" ਕਰ ਸਕੋਗੇ।\n"
"ਅਸੀਂ ਪਹਿਲਾਂ ਵੇਖਿਆ ਹੈ ਕਿ ਟ੍ਰੇਨਿੰਗ ਦੌਰਾਨ ਸਹੀਤਾ ਘਟਦੀ ਹੈ। ਇਹ ਦੇਖਣਾ ਚੰਗਾ ਹੋਵੇਗਾ ਕਿ ਟ੍ਰੇਨਿੰਗ ਦੌਰਾਨ ਵੱਖ-ਵੱਖ ਕਰਨ ਵਾਲੀ ਲਾਈਨ ਕਿਵੇਂ ਬਦਲਦੀ ਹੈ। ਹੇਠਾਂ ਦਿੱਤਾ ਕੋਡ ਸਭ ਕੁਝ ਇੱਕ ਗ੍ਰਾਫ 'ਤੇ ਵਿਜੁਅਲਾਈਜ਼ ਕਰੇਗਾ, ਅਤੇ ਤੁਸੀਂ ਸਲਾਈਡਰ ਨੂੰ ਹਿਲਾ ਕੇ ਟ੍ਰੇਨਿੰਗ ਪ੍ਰਕਿਰਿਆ ਵਿੱਚ \"ਸਮੇਂ ਦੀ ਯਾਤਰਾ\" ਕਰ ਸਕਦੇ ਹੋ।\n"
]
},
{
@ -527,16 +529,16 @@
"source": [
"## ਪਰਸੈਪਟ੍ਰਾਨ ਦੀਆਂ ਸੀਮਾਵਾਂ\n",
"\n",
"ਜਿਵੇਂ ਤੁਸੀਂ ਉੱਪਰ ਵੇਖਿਆ, ਪਰਸੈਪਟ੍ਰਾਨ ਇੱਕ **ਰੇਖੀਕ ਵਰਗੀਕਰਨ ਵਾਲਾ** ਹੈ। ਇਹ ਦੋ ਵਰਗਾਂ ਨੂੰ ਚੰਗੀ ਤਰ੍ਹਾਂ ਵੱਖ ਕਰ ਸਕਦਾ ਹੈ ਜੇ ਉਹ **ਰੇਖੀਕ ਤੌਰ 'ਤੇ ਵੱਖਰੇ** ਹੋਣ, ਅਰਥਾਤ ਜੇ ਉਹਨਾਂ ਨੂੰ ਇੱਕ ਸਿੱਧੀ ਰੇਖਾ ਨਾਲ ਵੱਖ ਕੀਤਾ ਜਾ ਸਕੇ। ਨਹੀਂ ਤਾਂ, ਪਰਸੈਪਟ੍ਰਾਨ ਦੀ ਟ੍ਰੇਨਿੰਗ ਪ੍ਰਕਿਰਿਆ ਕਦੇ ਵੀ ਸੰਮਤ ਨਹੀਂ ਹੋਵੇਗੀ।\n",
"ਜਿਵੇਂ ਤੁਸੀਂ ਉੱਪਰ ਵੇਖਿਆ, ਪਰਸੈਪਟ੍ਰਾਨ ਇੱਕ **ਰੇਖੀਕ ਵਰਗੀਕਰਤਾ** ਹੈ। ਇਹ ਦੋ ਵਰਗਾਂ ਵਿੱਚ ਵੱਖ-ਵੱਖ ਕਰ ਸਕਦਾ ਹੈ ਜੇ ਉਹ **ਰੇਖੀਕ ਤੌਰ 'ਤੇ ਵੱਖ-ਵੱਖ ਕਰਨਯੋਗ** ਹਨ, ਅਰਥਾਤ ਇੱਕ ਸਿੱਧੀ ਰੇਖਾ ਦੁਆਰਾ ਵੱਖ ਕੀਤੇ ਜਾ ਸਕਦੇ ਹਨ। ਨਹੀਂ ਤਾਂ, ਪਰਸੈਪਟ੍ਰਾਨ ਟ੍ਰੇਨਿੰਗ ਪ੍ਰਕਿਰਿਆ ਸੰਮਤ ਨਹੀਂ ਹੋਵੇਗੀ।\n",
"\n",
"ਇੱਕ ਸਭ ਤੋਂ ਸਪਸ਼ਟ ਉਦਾਹਰਨ ਜਿਸਨੂੰ ਪਰਸੈਪਟ੍ਰਾਨ ਹੱਲ ਨਹੀਂ ਕਰ ਸਕਦਾ, ਉਹ ਹੈ **XOR ਸਮੱਸਿਆ**। ਅਸੀਂ ਚਾਹੁੰਦੇ ਹਾਂ ਕਿ ਸਾਡਾ ਪਰਸੈਪਟ੍ਰਾਨ XOR ਬੂਲੀਅਨ ਫੰਕਸ਼ਨ ਸਿੱਖੇ, ਜਿਸਦਾ ਸੱਚਾਈ ਸਾਰਣੀ ਹੇਠਾਂ ਦਿੱਤੀ ਗਈ ਹੈ:\n",
"ਇੱਕ ਸਭ ਤੋਂ ਸਪਸ਼ਟ ਉਦਾਹਰਨ ਜਿਸ ਨੂੰ ਪਰਸੈਪਟ੍ਰਾਨ ਹੱਲ ਨਹੀਂ ਕਰ ਸਕਦਾ, ਉਹ ਹੈ **XOR ਸਮੱਸਿਆ**। ਅਸੀਂ ਚਾਹੁੰਦੇ ਹਾਂ ਕਿ ਸਾਡਾ ਪਰਸੈਪਟ੍ਰਾਨ XOR ਬੂਲੀਅਨ ਫੰਕਸ਼ਨ ਸਿੱਖੇ, ਜਿਸਦਾ ਸੱਚ-ਟੇਬਲ ਹੇਠਾਂ ਦਿੱਤਾ ਗਿਆ ਹੈ:\n",
"\n",
"| | 0 | 1 |\n",
"|---|---|---|\n",
"| 0 | 0 | 1 | \n",
"| 1 | 1 | 0 |\n",
"\n",
"ਆਓ ਇਸਨੂੰ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰੀਏ! ਅਸੀਂ ਸਾਰੇ ਸਕਾਰਾਤਮਕ ਅਤੇ ਨਕਾਰਾਤਮਕ ਟ੍ਰੇਨਿੰਗ ਨਮੂਨਿਆਂ ਨੂੰ ਮੈਨੁਅਲ ਤੌਰ 'ਤੇ ਭਰਾਂਗੇ, ਅਤੇ ਫਿਰ ਉੱਪਰ ਪਰਿਭਾਸ਼ਿਤ ਸਾਡੀ train ਫੰਕਸ਼ਨ ਨੂੰ ਕਾਲ ਕਰਾਂਗੇ:\n"
"ਆਓ ਇਸਨੂੰ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰੀਏ! ਅਸੀਂ ਸਾਰੇ ਸਕਾਰਾਤਮਕ ਅਤੇ ਨਕਾਰਾਤਮਕ ਟ੍ਰੇਨਿੰਗ ਨਮੂਨੇ ਹੱਥੋਂ ਭਰਾਂਗੇ, ਅਤੇ ਫਿਰ ਉੱਪਰ ਪਰिभਾਸ਼ਿਤ ਸਾਡੀ train ਫੰਕਸ਼ਨ ਨੂੰ ਕਾਲ ਕਰਾਂਗੇ:\n"
]
},
{
@ -603,19 +605,19 @@
}
},
"source": [
"ਜਿਵੇਂ ਕਿ ਉੱਪਰ ਦਿੱਤੇ ਗ੍ਰਾਫ ਤੋਂ ਦਿਖਾਈ ਦੇ ਰਿਹਾ ਹੈ, ਸਹੀਤਾ ਕਦੇ ਵੀ 75% ਤੋਂ ਵੱਧ ਨਹੀਂ ਜਾਂਦੀ, ਕਿਉਂਕਿ ਸਾਰੇ ਸੰਭਾਵਿਤ ਉਦਾਹਰਣਾਂ ਨੂੰ ਸਹੀ ਕਰਨ ਲਈ ਇੱਕ ਸਿੱਧੀ ਰੇਖਾ ਖਿੱਚਣਾ ਅਸੰਭਵ ਹੈ।\n",
"ਜਿਵੇਂ ਤੁਸੀਂ ਉੱਪਰ ਦਿੱਤੇ ਗ੍ਰਾਫ ਤੋਂ ਦੇਖ ਸਕਦੇ ਹੋ, ਸਹੀਤਾ ਕਦੇ ਵੀ 75% ਤੋਂ ਉੱਪਰ ਨਹੀਂ ਜਾਂਦੀ, ਕਿਉਂਕਿ ਸਾਰੇ ਸੰਭਾਵਿਤ ਉਦਾਹਰਣਾਂ ਨੂੰ ਸਹੀ ਕਰਨ ਲਈ ਸਿੱਧੀ ਰੇਖਾ ਖਿੱਚਣਾ ਅਸੰਭਵ ਹੈ।\n",
"\n",
"XOR ਸਮੱਸਿਆ ਪਰਸੈਪਟ੍ਰਾਨ ਦੀਆਂ ਸੀਮਾਵਾਂ ਦਾ ਇੱਕ ਕਲਾਸਿਕ ਉਦਾਹਰਣ ਹੈ, ਅਤੇ ਇਸਨੂੰ 1969 ਵਿੱਚ ਮਾਰਵਿਨ ਮਿੰਸਕੀ ਅਤੇ ਸੇਮੂਰ ਪਪਰਟ ਨੇ ਆਪਣੀ ਕਿਤਾਬ [Perceptrons](https://en.wikipedia.org/wiki/Perceptrons_(book)) ਵਿੱਚ ਦਰਸਾਇਆ ਸੀ। ਇਸ ਅਵਲੋਕਨ ਨੇ ਨਿਊਰਲ ਨੈਟਵਰਕ ਦੇ ਖੇਤਰ ਵਿੱਚ ਲਗਭਗ 10 ਸਾਲਾਂ ਤੱਕ ਖੋਜ ਨੂੰ ਸੀਮਿਤ ਕਰ ਦਿੱਤਾ, ਹਾਲਾਂਕਿ - ਅਤੇ ਅਸੀਂ ਇਸਨੂੰ ਆਪਣੇ ਕੋਰਸ ਦੇ ਅਗਲੇ ਭਾਗ ਵਿੱਚ ਵੇਖਾਂਗੇ - ਬਹੁ-ਪਰਤਾਂ ਵਾਲੇ ਪਰਸੈਪਟ੍ਰਾਨ ਅਜਿਹੀਆਂ ਸਮੱਸਿਆਵਾਂ ਨੂੰ ਸਹੀ ਤਰੀਕੇ ਨਾਲ ਹੱਲ ਕਰਨ ਦੇ ਯੋਗ ਹਨ।\n",
"XOR ਸਮੱਸਿਆ ਪਰਸੈਪਟ੍ਰਾਨ ਦੀਆਂ ਸੀਮਾਵਾਂ ਦਾ ਇੱਕ ਕਲਾਸਿਕ ਉਦਾਹਰਣ ਹੈ, ਅਤੇ ਇਸਨੂੰ 1969 ਵਿੱਚ ਮਾਰਵਿਨ ਮਿੰਸਕੀ ਅਤੇ ਸੇਮੂਰ ਪਪਰਟ ਨੇ ਆਪਣੀ ਕਿਤਾਬ [Perceptrons](https://en.wikipedia.org/wiki/Perceptrons_(book)) ਵਿੱਚ ਦਰਸਾਇਆ ਸੀ। ਇਸ ਅਵਲੋਕਨ ਨੇ ਨਿਊਰਲ ਨੈਟਵਰਕ ਦੇ ਖੇਤਰ ਵਿੱਚ ਲਗਭਗ 10 ਸਾਲਾਂ ਤੱਕ ਖੋਜ ਨੂੰ ਸੀਮਿਤ ਕਰ ਦਿੱਤਾ, ਹਾਲਾਂਕਿ - ਅਤੇ ਅਸੀਂ ਇਸ ਨੂੰ ਆਪਣੇ ਕੋਰਸ ਦੇ ਅਗਲੇ ਭਾਗ ਵਿੱਚ ਦੇਖਾਂਗੇ - ਬਹੁ-ਪਤਰੀ ਪਰਸੈਪਟ੍ਰਾਨ ਇਸ ਤਰ੍ਹਾਂ ਦੀਆਂ ਸਮੱਸਿਆਵਾਂ ਨੂੰ ਸਹੀ ਤਰੀਕੇ ਨਾਲ ਹੱਲ ਕਰਨ ਦੇ ਯੋਗ ਹਨ।\n",
"\n",
"## ਜਟਿਲ ਉਦਾਹਰਣ - MNIST\n",
"\n",
"ਹਾਲਾਂਕਿ ਪਰਸੈਪਟ੍ਰਾਨ XOR ਸਮੱਸਿਆ ਨੂੰ ਹੱਲ ਨਹੀਂ ਕਰ ਸਕਦਾ, ਪਰ ਇਹ ਕਈ ਹੋਰ ਜਟਿਲ ਸਮੱਸਿਆਵਾਂ ਨੂੰ ਹੱਲ ਕਰ ਸਕਦਾ ਹੈ, ਜਿਵੇਂ ਕਿ ਹੱਥ ਨਾਲ ਲਿਖੇ ਅੱਖਰਾਂ ਦੀ ਪਹਿਚਾਣ।\n",
"ਹਾਲਾਂਕਿ ਪਰਸੈਪਟ੍ਰਾਨ XOR ਸਮੱਸਿਆ ਨੂੰ ਹੱਲ ਨਹੀਂ ਕਰ ਸਕਦਾ, ਇਹ ਕਈ ਹੋਰ ਜਟਿਲ ਸਮੱਸਿਆਵਾਂ ਨੂੰ ਹੱਲ ਕਰ ਸਕਦਾ ਹੈ, ਜਿਵੇਂ ਕਿ ਹੱਥ ਨਾਲ ਲਿਖੇ ਅੱਖਰਾਂ ਦੀ ਪਹਿਚਾਣ।\n",
"\n",
"ਇੱਕ ਡਾਟਾਸੈਟ ਜੋ ਮਸ਼ੀਨ ਲਰਨਿੰਗ ਸਿੱਖਣ ਦੌਰਾਨ ਅਕਸਰ ਵਰਤੀ ਜਾਂਦੀ ਹੈ, ਉਸਨੂੰ [MNIST](https://en.wikipedia.org/wiki/MNIST_database) ਕਿਹਾ ਜਾਂਦਾ ਹੈ। ਇਹ ਮੋਡੀਫਾਇਡ ਨੈਸ਼ਨਲ ਇੰਸਟੀਟਿਊਟ ਆਫ ਸਟੈਂਡਰਡਸ ਐਂਡ ਟੈਕਨੋਲੋਜੀ ਦੁਆਰਾ ਬਣਾਇਆ ਗਿਆ ਹੈ ਅਤੇ ਇਸ ਵਿੱਚ 60000 ਹੱਥ ਨਾਲ ਲਿਖੇ ਅੰਕਾਂ ਦਾ ਟ੍ਰੇਨਿੰਗ ਸੈੱਟ ਸ਼ਾਮਲ ਹੈ, ਜੋ ਲਗਭਗ 250 ਵਿਦਿਆਰਥੀਆਂ ਅਤੇ ਸੰਸਥਾ ਦੇ ਕਰਮਚਾਰੀਆਂ ਤੋਂ ਇਕੱਠੇ ਕੀਤੇ ਗਏ ਹਨ। ਇਸਦੇ ਨਾਲ ਹੀ 10000 ਅੰਕਾਂ ਦਾ ਇੱਕ ਟੈਸਟ ਡਾਟਾਸੈਟ ਵੀ ਹੈ, ਜੋ ਵੱਖ-ਵੱਖ ਵਿਅਕਤੀਆਂ ਤੋਂ ਇਕੱਠਾ ਕੀਤਾ ਗਿਆ ਹੈ।\n",
"ਮਸ਼ੀਨ ਲਰਨਿੰਗ ਵਿੱਚ ਮਾਹਰ ਬਣਨ ਦੌਰਾਨ ਅਕਸਰ ਵਰਤਿਆ ਜਾਣ ਵਾਲਾ ਡਾਟਾਸੈਟ [MNIST](https://en.wikipedia.org/wiki/MNIST_database) ਕਹਿੰਦਾ ਹੈ। ਇਹ Modified National Institute of Standards and Technology ਦੁਆਰਾ ਬਣਾਇਆ ਗਿਆ ਹੈ, ਅਤੇ ਇਸ ਵਿੱਚ 60000 ਹੱਥ ਨਾਲ ਲਿਖੇ ਅੰਕਾਂ ਦਾ ਟ੍ਰੇਨਿੰਗ ਸੈੱਟ ਹੈ, ਜੋ ਲਗਭਗ 250 ਵਿਦਿਆਰਥੀਆਂ ਅਤੇ ਸੰਸਥਾ ਦੇ ਕਰਮਚਾਰੀਆਂ ਤੋਂ ਇਕੱਠੇ ਕੀਤੇ ਗਏ ਹਨ। ਇਸ ਵਿੱਚ 10000 ਅੰਕਾਂ ਦਾ ਟੈਸਟ ਡਾਟਾਸੈਟ ਵੀ ਹੈ, ਜੋ ਵੱਖ-ਵੱਖ ਵਿਅਕਤੀਆਂ ਤੋਂ ਇਕੱਠਾ ਕੀਤਾ ਗਿਆ ਹੈ।\n",
"\n",
"ਸਾਰੇ ਅੰਕ 28x28 ਪਿਕਸਲ ਦੇ ਗ੍ਰੇਸਕੇਲ ਚਿੱਤਰਾਂ ਰੂਪ ਵਿੱਚ ਦਰਸਾਏ ਗਏ ਹਨ।\n",
"ਸਾਰੇ ਅੰਕ 28x28 ਪਿਕਸਲ ਦੇ ਗ੍ਰੇਸਕੇਲ ਚਿੱਤਰਾਂ ਦੁਆਰਾ ਦਰਸਾਏ ਗਏ ਹਨ।\n",
"\n",
"> MNIST ਡਾਟਾਸੈਟ [Kaggle](https://www.kaggle.com/c/digit-recognizer) 'ਤੇ ਇੱਕ ਟ੍ਰੇਨਿੰਗ ਮੁਕਾਬਲੇ ਦੇ ਰੂਪ ਵਿੱਚ ਉਪਲਬਧ ਹੈ, ਜੋ ਮਸ਼ੀਨ ਲਰਨਿੰਗ ਮੁਕਾਬਲਿਆਂ ਅਤੇ ਪ੍ਰਤੀਯੋਗਿਤਾਵਾਂ ਦੀ ਮਿਜ਼ਬਾਨੀ ਕਰਦਾ ਹੈ। ਜਦੋਂ ਤੁਸੀਂ MNIST ਅੰਕਾਂ ਨੂੰ ਕਲਾਸੀਫਾਈ ਕਰਨਾ ਸਿੱਖ ਲੈਂਦੇ ਹੋ, ਤਾਂ ਤੁਸੀਂ ਆਪਣਾ ਹੱਲ Kaggle 'ਤੇ ਜਮ੍ਹਾਂ ਕਰ ਸਕਦੇ ਹੋ ਤਾਂ ਜੋ ੇਖਿਆ ਜਾ ਸਕੇ ਕਿ ਇਹ ਹੋਰ ਭਾਗੀਦਾਰਾਂ ਵਿੱਚ ਕਿਵੇਂ ਦਰਜਾ ਪ੍ਰਾਪਤ ਕਰਦਾ ਹੈ।\n",
"> MNIST ਡਾਟਾਸੈਟ [Kaggle](https://www.kaggle.com/c/digit-recognizer) 'ਤੇ ਇੱਕ ਟ੍ਰੇਨਿੰਗ ਮੁਕਾਬਲੇ ਵਜੋਂ ਉਪਲਬਧ ਹੈ, ਜੋ ਮਸ਼ੀਨ ਲਰਨਿੰਗ ਮੁਕਾਬਲਿਆਂ ਅਤੇ ਪ੍ਰਤੀਯੋਗਿਤਾਵਾਂ ਦੀ ਮਿਜ਼ਬਾਨੀ ਕਰਦਾ ਹੈ। ਜਦੋਂ ਤੁਸੀਂ MNIST ਅੰਕਾਂ ਨੂੰ ਵਰਗਬੱਧ ਕਰਨ ਦਾ ਤਰੀਕਾ ਸਿੱਖ ਲੈਂਦੇ ਹੋ, ਤਾਂ ਤੁਸੀਂ ਆਪਣਾ ਹੱਲ Kaggle 'ਤੇ ਜਮ੍ਹਾਂ ਕਰ ਸਕਦੇ ਹੋ ਤਾਂ ਜੋ ਇਹ ਦੇਖਿਆ ਜਾ ਸਕੇ ਕਿ ਇਹ ਹੋਰ ਭਾਗੀਦਾਰਾਂ ਵਿੱਚ ਕਿਵੇਂ ਦਰਜ ਕੀਤਾ ਜਾਂਦਾ ਹੈ।\n",
"\n",
"ਅਸੀਂ MNIST ਡਾਟਾਸੈਟ ਨੂੰ ਲੋਡ ਕਰਕੇ ਸ਼ੁਰੂ ਕਰਦੇ ਹਾਂ:\n"
]
@ -642,7 +644,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"ਚਲੋ ਹੁਣ ਡੇਟਾਸੈੱਟ ਨੂੰ ਪਲਾਟ ਕਰੀਏ:\n"
"ਚਲੋ ਹੁਣ ਡੇਟਾਸੈਟ ਨੂੰ ਪਲਾਟ ਕਰਦੇ ਹਾਂ:\n"
]
},
{
@ -693,7 +695,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"ਕਿਉਂਕਿ ਪਰਸੈਪਟ੍ਰੋਨ ਇੱਕ ਦੁਇਕ ਵਰਗੀਕਰਨ ਵਾਲਾ ਹੈ, ਅਸੀਂ ਆਪਣੀ ਸਮੱਸਿਆ ਨੂੰ ਸਿਰਫ ਦੋ ਅੰਕਾਂ ਨੂੰ ਪਛਾਣਣ ਤੱਕ ਸੀਮਿਤ ਕਰਾਂਗੇ। ਹੇਠਾਂ ਦਿੱਤਾ ਫੰਕਸ਼ਨ ਦੋ ਦਿੱਤੇ ਗਏ ਅੰਕਾਂ ਨਾਲ ਸਕਾਰਾਤਮਕ ਅਤੇ ਨਕਾਰਾਤਮਕ ਨਮੂਨਾ ਐਰੇ ਭਰਗਾ (ਅਤੇ ਸਪਸ਼ਟਤਾ ਲਈ ਉਹਨਾਂ ਅੰਕਾਂ ਦੇ ਨਮੂਨੇ ਵੀ ਦਿਖਾਵੇਗਾ)।\n"
"ਕਿਉਂਕਿ ਪਰਸੈਪਟ੍ਰਾਨ ਇੱਕ ਦਵਾਈ ਵਰਗੀਕਰਨ ਹੈ, ਅਸੀਂ ਆਪਣੀ ਸਮੱਸਿਆ ਨੂੰ ਸਿਰਫ਼ ਦੋ ਅੰਕਾਂ ਨੂੰ ਪਛਾਣਨ ਤੱਕ ਸੀਮਿਤ ਕਰਾਂਗੇ। ਹੇਠਾਂ ਦਿੱਤਾ ਫੰਕਸ਼ਨ ਦੋ ਦਿੱਤੇ ਗਏ ਅੰਕਾਂ ਨਾਲ ਸਕਾਰਾਤਮਕ ਅਤੇ ਨਕਾਰਾਤਮਕ ਨਮੂਨਾ ਐਰੇ ਭਰਗਾ (ਅਤੇ ਸਪਸ਼ਟਤਾ ਲਈ ਉਹਨਾਂ ਅੰਕਾਂ ਦੇ ਨਮੂਨੇ ਵੀ ਦਿਖਾਵੇਗਾ)।\n"
]
},
{
@ -733,7 +735,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"ਅਸੀਂ 0 ਅਤੇ 1 ਦੇ ਵਿਚਕਾਰ ਵੱਖਰਾ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰਕੇ ਸ਼ੁਰੂ ਕਰਾਂਗੇ:\n"
"ਅਸੀਂ 0 ਅਤੇ 1 ਦੇ ਵਿਚਕਾਰ ਵੰਡਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰਕੇ ਸ਼ੁਰੂ ਕਰਾਂਗੇ:\n"
]
},
{
@ -829,11 +831,13 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"ਕਿਰਪਾ ਕਰਕੇ ਸਲਾਈਡਰ ਨੂੰ ਟ੍ਰੇਨਿੰਗ ਦੇ ਅੰਤ ਵੱਲ ਖਿਸਕਾਓ ਅਤੇ ਵੇਖੋ ਕਿ ਵਜ਼ਨ ਮੈਟ੍ਰਿਕਸ ਖੱਬੇ ਪਾਸੇ ਕਿਵੇਂ ਪਲਾਟ ਕੀਤਾ ਗਿਆ ਹੈ। ਇਹ ਮੈਟ੍ਰਿਕਸ ਤੁਹਾਨੂੰ ਸਮਝਣ ਵਿੱਚ ਮਦਦ ਕਰੇਗਾ ਕਿ ਪਰਸੈਪਟ੍ਰਾਨ ਅਸਲ ਵਿੱਚ ਕਿਵੇਂ ਕੰਮ ਕਰਦਾ ਹੈ। ਤੁਸੀਂ ਖੇਤਰ ਦੇ ਵਿਚਕਾਰ ਉੱਚੇ ਵਜ਼ਨ ਵਾਲੇ ਮੁੱਲਾਂ ਨੂੰ ਦੇਖ ਸਕਦੇ ਹੋ, ਜੋ ਪਿਕਸਲਾਂ ਨੂੰ ਦਰਸਾਉਂਦੇ ਹਨ ਜੋ ਆਮ ਤੌਰ 'ਤੇ ਅੰਕ 1 ਲਈ ਮੌਜੂਦ ਹੁੰਦੇ ਹਨ, ਅਤੇ ਪਾਸੇ ਨੀਵੇਂ ਨਕਾਰਾਤਮਕ ਮੁੱਲਾਂ, ਜਿੱਥੇ 0 ਅੰਕ ਦੇ ਹਿੱਸੇ ਹੁੰਦੇ ਹਨ। ਇਸ ਲਈ, ਜੇ ਪਰਸੈਪਟ੍ਰਾਨ ਨੂੰ ਦਿੱਤਾ ਗਿਆ ਅੰਕ ਅਸਲ ਵਿੱਚ 1 ਹੈ, ਤਾਂ ਇਸਦਾ ਵਿਚਲਾ ਹਿੱਸਾ ਉੱਚੇ ਮੁੱਲਾਂ ਨਾਲ ਗੁਣਾ ਕੀਤਾ ਜਾਵੇਗਾ, ਜਿਸ ਨਾਲ ਸਕਾਰਾਤਮਕ ਨਤੀਜਾ ਨਿਕਲਦਾ ਹੈ। ਇਸਦੇ ਉਲਟ, ਜਦੋਂ ਪਰਸੈਪਟ੍ਰਾਨ 0 ਨੂੰ ਵੇਖਦਾ ਹੈ, ਤਾਂ ਸੰਬੰਧਿਤ ਪਿਕਸਲਾਂ ਨੂੰ ਨਕਾਰਾਤਮਕ ਸੰਖਿਆਵਾਂ ਨਾਲ ਗੁਣਾ ਕੀਤਾ ਜਾਵੇਗਾ।\n",
"ਕਿਰਪਾ ਕਰਕੇ ਧਿਆਨ ਦਿਓ ਕਿ ਸਹੀਪਨ ਕਿੰਨੀ ਤੇਜ਼ੀ ਨਾਲ ਲਗਭਗ 100% ਤੱਕ ਪਹੁੰਚ ਜਾਂਦਾ ਹੈ।\n",
"\n",
"> ਤੁਸੀਂ ਧਿਆਨ ਦੇ ਸਕਦੇ ਹੋ ਕਿ ਜੇ ਅਸੀਂ ਆਪਣੇ ਪਰਸੈਪਟ੍ਰਾਨ ਨੂੰ ਅੰਕ 1 ਹੌਲੀ ਜਿਹਾ ਖਿੱਸਕਾ ਕੇ ਦਿੰਦੇ ਹਾਂ, ਤਾਂ ਕਿ ਇਸਦੇ ਪਿਕਸਲ ਉਹ ਜਗ੍ਹਾ ਘੇਰ ਲੈਂਦੇ ਹਨ ਜਿੱਥੇ 0 ਦੇ ਖੜੇ ਹਿੱਸੇ ਹਨ, ਤਾਂ ਸਾਨੂੰ ਗਲਤ ਨਤੀਜਾ ਮਿਲ ਸਕਦਾ ਹੈ। ਕਿਉਂਕਿ ਸਾਡੇ MNIST ਡੇਟਾਸੈਟ ਦੀ ਪ੍ਰਕਿਰਤੀ ਅਜਿਹੀ ਹੈ ਕਿ ਸਾਰੇ ਅੰਕ ਕੇਂਦਰਿਤ ਅਤੇ ਢੰਗ ਨਾਲ ਸਥਿਤ ਹਨ, ਅਤੇ ਪਰਸੈਪਟ੍ਰਾਨ ਇਸ 'ਤੇ ਨੰਬਰਾਂ ਵਿੱਚ ਫਰਕ ਕਰਨ ਲਈ ਨਿਰਭਰ ਕਰਦਾ ਹੈ।\n",
"ਕਿਰਪਾ ਕਰਕੇ ਸਲਾਈਡਰ ਨੂੰ ਟ੍ਰੇਨਿੰਗ ਦੇ ਅੰਤ ਵੱਲ ਕਿਸੇ ਸਥਿਤੀ 'ਤੇ ਖਿਸਕਾਓ ਅਤੇ ਖੱਬੇ ਪਾਸੇ ਦਿਖਾਈ ਗਈ ਵਜ਼ਨ ਮੈਟ੍ਰਿਕਸ ਨੂੰ ਦੇਖੋ। ਇਹ ਮੈਟ੍ਰਿਕਸ ਤੁਹਾਨੂੰ ਸਮਝਣ ਵਿੱਚ ਮਦਦ ਕਰੇਗਾ ਕਿ ਪਰਸੈਪਟ੍ਰੋਨ ਅਸਲ ਵਿੱਚ ਕਿਵੇਂ ਕੰਮ ਕਰਦਾ ਹੈ। ਤੁਸੀਂ ਖੇਤਰ ਦੇ ਵਿਚਕਾਰ ਉੱਚੇ ਵਜ਼ਨ ਵਾਲੀਆਂ ਕਦਰਾਂ ਨੂੰ ਦੇਖ ਸਕਦੇ ਹੋ, ਜੋ ਉਹਨਾਂ ਪਿਕਸਲਾਂ ਨੂੰ ਦਰਸਾਉਂਦੀਆਂ ਹਨ ਜੋ ਆਮ ਤੌਰ 'ਤੇ ਅੰਕ 1 ਲਈ ਮੌਜੂਦ ਹੁੰਦੀਆਂ ਹਨ, ਅਤੇ ਪਾਸਿਆਂ 'ਤੇ ਘੱਟ ਨਕਾਰਾਤਮਕ ਕਦਰਾਂ, ਜਿੱਥੇ ਅੰਕ 0 ਦੇ ਹਿੱਸੇ ਹੁੰਦੇ ਹਨ। ਇਸ ਲਈ, ਜੇ ਪਰਸੈਪਟ੍ਰੋਨ ਨੂੰ ਪੇਸ਼ ਕੀਤਾ ਗਿਆ ਅੰਕ ਦਰਅਸਲ 1 ਹੈ, ਤਾਂ ਇਸਦਾ ਵਿਚਕਾਰਲਾ ਹਿੱਸਾ ਉੱਚੀਆਂ ਕਦਰਾਂ ਨਾਲ ਗੁਣਾ ਕੀਤਾ ਜਾਵੇਗਾ, ਜਿਸ ਨਾਲ ਸਕਾਰਾਤਮਕ ਨਤੀਜਾ ਨਿਕਲੇਗਾ। ਇਸਦੇ ਉਲਟ, ਜਦੋਂ ਪਰਸੈਪਟ੍ਰੋਨ 0 ਨੂੰ ਵੇਖਦਾ ਹੈ, ਤਾਂ ਸੰਬੰਧਤ ਪਿਕਸਲਾਂ ਨੂੰ ਨਕਾਰਾਤਮਕ ਨੰਬਰਾਂ ਨਾਲ ਗੁਣਾ ਕੀਤਾ ਜਾਵੇਗਾ।\n",
"\n",
"ਹੁਣ ਆਓ ਵੱਖ-ਵੱਖ ਅੰਕਾਂ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰਦੇ ਹਾਂ:\n"
"> ਤੁਸੀਂ ਇਹ ਗੱਲ ਨੋਟ ਕਰ ਸਕਦੇ ਹੋ ਕਿ ਜੇ ਅਸੀਂ ਆਪਣੇ ਪਰਸੈਪਟ੍ਰੋਨ ਨੂੰ ਅੰਕ 1 ਹੌਲੀ ਜਿਹਾ ਖਿਤਿਜੀ ਰੂਪ ਵਿੱਚ ਖਿਸਕਾ ਕੇ ਦਿੰਦੇ ਹਾਂ, ਤਾਂ ਕਿ ਇਸਦੇ ਪਿਕਸਲ ਉਹ ਜਗ੍ਹਾ ਘੇਰ ਲੈਂਦੇ ਹਨ ਜਿੱਥੇ 0 ਦੇ ਖਿਤਿਜੀ ਹਿੱਸੇ ਹੁੰਦੇ ਹਨ, ਤਾਂ ਸਾਨੂੰ ਗਲਤ ਨਤੀਜਾ ਮਿਲ ਸਕਦਾ ਹੈ। ਕਿਉਂਕਿ ਸਾਡੇ MNIST ਡੇਟਾਸੈਟ ਦੀ ਕੁਦਰਤ ਅਜਿਹੀ ਹੈ ਕਿ ਸਾਰੇ ਅੰਕ ਕੇਂਦਰਿਤ ਅਤੇ ਠੀਕ ਤਰ੍ਹਾਂ ਸਥਿਤ ਹਨ, ਅਤੇ ਪਰਸੈਪਟ੍ਰੋਨ ਇਸ 'ਤੇ ਨਿਰਭਰ ਕਰਦਾ ਹੈ ਅੰਕਾਂ ਵਿੱਚ ਫਰਕ ਕਰਨ ਲਈ।\n",
"\n",
"ਹੁਣ ਆਓ ਵੱਖ-ਵੱਖ ਅੰਕਾਂ ਨੂੰ ਅਜ਼ਮਾਈਏ: \n"
]
},
{
@ -909,11 +913,11 @@
"source": [
"## ਚਰਚਾ\n",
"\n",
"ਕਿਸੇ ਕਾਰਨ ਕਰਕੇ, 2 ਅਤੇ 5 ਨੂੰ ਵੱਖਰਾ ਕਰਨਾ ਇੰਨਾ ਆਸਾਨ ਨਹੀਂ ਹੈ। ਹਾਲਾਂਕਿ ਸਾਨੂੰ ਕਾਫ਼ੀ ਉੱਚੀ ਸਹੀਤਾ (85% ਤੋਂ ਵੱਧ) ਮਿਲਦੀ ਹੈ, ਪਰ ਅਸੀਂ ਸਾਫ਼ ਦੇਖ ਸਕਦੇ ਹਾਂ ਕਿ perceptron ਕਿਸੇ ਸਮੇਂ ਸਿੱਖਣਾ ਬੰਦ ਕਰ ਦਿੰਦਾ ਹੈ।\n",
"ਕਿਸੇ ਕਾਰਨ ਕਰਕੇ, 2 ਅਤੇ 5 ਨੂੰ ਆਸਾਨੀ ਨਾਲ ਵੱਖ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ। ਹਾਲਾਂਕਿ ਸਾਨੂੰ ਨਿਸ਼ਚਿਤ ਤੌਰ 'ਤੇ ਉੱਚ ਸਹੀਤਾ (85% ਤੋਂ ਵੱਧ) ਮਿਲਦੀ ਹੈ, ਅਸੀਂ ਸਪਸ਼ਟ ਤੌਰ 'ਤੇ ਦੇਖ ਸਕਦੇ ਹਾਂ ਕਿ perceptron ਕਿਸੇ ਸਮੇਂ ਸਿੱਖਣਾ ਬੰਦ ਕਰ ਦਿੰਦਾ ਹੈ।\n",
"\n",
"ਇਹ ਸਮਝਣ ਲਈ ਕਿ ਇਹ ਕਿਉਂ ਹੁੰਦਾ ਹੈ, ਅਸੀਂ [Principal Component Analysis](https://en.wikipedia.org/wiki/Principal_component_analysis) (PCA) ਦੀ ਵਰਤੋਂ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰ ਸਕਦੇ ਹਾਂ। ਇਹ ਇੱਕ ਮਸ਼ੀਨ ਲਰਨਿੰਗ ਤਕਨੀਕ ਹੈ ਜੋ ਇਨਪੁਟ ਡਾਟਾਸੈੱਟ ਦੀ dimensionality ਨੂੰ ਘਟਾਉਣ ਲਈ ਵਰਤੀ ਜਾਂਦੀ ਹੈ, ਇਸ ਤਰ੍ਹਾਂ ਕਿ ਕਲਾਸਾਂ ਦੇ ਵਿਚਕਾਰ ਸਭ ਤੋਂ ਵਧੀਆ ਵੱਖਰਾ ਪ੍ਰਾਪਤ ਕੀਤਾ ਜਾ ਸਕੇ।\n",
"ਇਸ ਗੱਲ ਨੂੰ ਸਮਝਣ ਲਈ, ਅਸੀਂ [Principal Component Analysis](https://en.wikipedia.org/wiki/Principal_component_analysis) (PCA) ਦੀ ਵਰਤੋਂ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰ ਸਕਦੇ ਹਾਂ। ਇਹ ਇੱਕ ਮਸ਼ੀਨ ਲਰਨਿੰਗ ਤਕਨੀਕ ਹੈ ਜੋ ਇਨਪੁਟ ਡਾਟਾਸੈੱਟ ਦੀ dimensionality ਨੂੰ ਘਟਾਉਣ ਲਈ ਵਰਤੀ ਜਾਂਦੀ ਹੈ, ਇਸ ਤਰੀਕੇ ਨਾਲ ਕਿ ਕਲਾਸਾਂ ਦੇ ਵਿਚਕਾਰ ਸਭ ਤੋਂ ਵਧੀਆ ਵੱਖਰਾਪਨ ਪ੍ਰਾਪਤ ਕੀਤਾ ਜਾ ਸਕੇ।\n",
"\n",
"ਸਾਡੇ ਕੇਸ ਵਿੱਚ, ਇੱਕ ਇਨਪੁਟ ਚਿੱਤਰ ਵਿੱਚ 784 ਪਿਕਸਲ (ਇਨਪੁਟ ਫੀਚਰ) ਹੁੰਦੇ ਹਨ, ਅਤੇ ਅਸੀਂ PCA ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਪੈਰਾਮੀਟਰ ਦੀ ਗਿਣਤੀ ਨੂੰ ਸਿਰਫ 2 ਤੱਕ ਘਟਾਉਣਾ ਚਾਹੁੰਦੇ ਹਾਂ, ਤਾਂ ਜੋ ਅਸੀਂ ਉਨ੍ਹਾਂ ਨੂੰ ਗ੍ਰਾਫ 'ਤੇ ਪਲਾਟ ਕਰ ਸਕੀਏ। ਇਹ ਦੋ ਪੈਰਾਮੀਟਰ ਮੂਲ ਫੀਚਰਾਂ ਦੇ ਲੀਨੀਅਰ ਕੌਬੀਨੇਸ਼ਨ ਹੋਣਗੇ, ਅਤੇ ਅਸੀਂ ਇਸ ਪ੍ਰਕਿਰਿਆ ਨੂੰ ਇਸ ਤਰ੍ਹਾਂ ਦੇਖ ਸਕਦੇ ਹਾਂ ਜਿਵੇਂ ਅਸੀਂ ਆਪਣੇ ਮੂਲ 784-ਡਾਈਮੇਨਸ਼ਨਲ ਸਪੇਸ ਨੂੰ \"ਘੁਮਾ\" ਰਹੇ ਹਾਂ ਅਤੇ ਇਸਦੀ ਪ੍ਰੋਜੈਕਸ਼ਨ ਨੂੰ 2D-ਸਪੇਸ ਵਿੱਚ ਦੇਖ ਰਹੇ ਹਾਂ, ਜਦ ਤੱਕ ਸਾਨੂੰ ਕਲਾਸਾਂ ਨੂੰ ਵੱਖਰਾ ਕਰਨ ਲਈ ਸਭ ਤੋਂ ਵਧੀਆ ਦ੍ਰਿਸ਼ਟੀਕੋਣ ਨਹੀਂ ਮਿਲ ਜਾਂਦਾ।\n"
"ਸਾਡੇ ਕੇਸ ਵਿੱਚ, ਇੱਕ ਇਨਪੁਟ ਚਿੱਤਰ ਵਿੱਚ 784 ਪਿਕਸਲ (ਇਨਪੁਟ ਫੀਚਰ) ਹੁੰਦੇ ਹਨ, ਅਤੇ ਅਸੀਂ PCA ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਪੈਰਾਮੀਟਰਾਂ ਦੀ ਗਿਣਤੀ ਨੂੰ ਸਿਰਫ 2 ਤੱਕ ਘਟਾਉਣਾ ਚਾਹੁੰਦੇ ਹਾਂ, ਤਾਂ ਜੋ ਅਸੀਂ ਉਨ੍ਹਾਂ ਨੂੰ ਗ੍ਰਾਫ 'ਤੇ ਪਲਾਟ ਕਰ ਸਕੀਏ। ਇਹ ਦੋ ਪੈਰਾਮੀਟਰ ਮੂਲ ਫੀਚਰਾਂ ਦੇ ਲੀਨੀਅਰ ਕੌਬੀਨੇਸ਼ਨ ਹੋਣਗੇ, ਅਤੇ ਅਸੀਂ ਇਸ ਪ੍ਰਕਿਰਿਆ ਨੂੰ \"ਸਾਡੇ ਮੂਲ 784-ਡਾਈਮੈਂਸ਼ਨਲ ਸਪੇਸ ਨੂੰ ਘੁੰਮਾਉਣ\" ਵਜੋਂ ਦੇਖ ਸਕਦੇ ਹਾਂ ਅਤੇ ਇਸਦੀ ਪ੍ਰੋਜੈਕਸ਼ਨ ਨੂੰ 2D-ਸਪੇਸ ਵਿੱਚ ਦੇਖ ਸਕਦੇ ਹਾਂ, ਜਦ ਤੱਕ ਸਾਨੂੰ ਕਲਾਸਾਂ ਨੂੰ ਵੱਖ ਕਰਨ ਲਈ ਸਭ ਤੋਂ ਵਧੀਆ ਦ੍ਰਿਸ਼ਟੀਕੋਣ ਨਹੀਂ ਮਿਲਦਾ।\n"
]
},
{
@ -1023,16 +1027,16 @@
}
},
"source": [
"ਜਿਵੇਂ ਤੁਸੀਂ ਦੇਖ ਸਕਦੇ ਹੋ, 0 ਅਤੇ 1 ਨੂੰ ਸਿੱਧੀ ਰੇਖਾ ਨਾਲ ਸਪਸ਼ਟ ਤੌਰ 'ਤੇ ਵੱਖ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ। ਇਹ ਦੱਸਦਾ ਹੈ ਕਿ ਮੂਲ 784-ਡਾਈਮੇਨਸ਼ਨਲ ਸਪੇਸ ਵਿੱਚ ਅੰਕਾਂ ਨਾਲ ਸਬੰਧਤ ਬਿੰਦੂ ਵੀ ਰੇਖੀ ਰੂਪ ਵਿੱਚ ਵੱਖ ਕੀਤੇ ਜਾ ਸਕਦੇ ਹਨ। 2 ਅਤੇ 5 ਦੇ ਮਾਮਲੇ ਵਿੱਚ, ਅਸੀਂ ਅਜਿਹੀ ਚੰਗੀ ਪ੍ਰੋਜੈਕਸ਼ਨ ਨਹੀਂ ਲੱਭ ਸਕਦੇ ਜੋ ਅੰਕਾਂ ਨੂੰ ਸਪਸ਼ਟ ਤੌਰ 'ਤੇ ਵੱਖ ਕਰ ਸਕੇ, ਅਤੇ ਇਸ ਕਰਕੇ ਕੁਝ ਗਲਤ ਵਰਗੀਕਰਨ ਦੇ ਮਾਮਲੇ ਹੋ ਸਕਦੇ ਹਨ।\n",
"ਜਿਵੇਂ ਤੁਸੀਂ ਦੇਖ ਸਕਦੇ ਹੋ, 0 ਅਤੇ 1 ਨੂੰ ਸਿੱਧੀ ਰੇਖਾ ਨਾਲ ਸਪਸ਼ਟ ਤੌਰ 'ਤੇ ਵੱਖ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ। ਇਹ ਦਰਸਾਉਂਦਾ ਹੈ ਕਿ ਮੂਲ 784-ਡਾਈਮੇਂਸ਼ਨਲ ਸਪੇਸ ਵਿੱਚ ਅੰਕਾਂ ਨਾਲ ਸਬੰਧਤ ਬਿੰਦੂ ਵੀ ਰੇਖੀਅਤ ਤੌਰ 'ਤੇ ਵੱਖ ਕੀਤੇ ਜਾ ਸਕਦੇ ਹਨ। 2 ਅਤੇ 5 ਦੇ ਮਾਮਲੇ ਵਿੱਚ, ਅਸੀਂ ਉਹ ਚੰਗੀ ਪ੍ਰੋਜੈਕਸ਼ਨ ਨਹੀਂ ਲੱਭ ਸਕਦੇ ਜੋ ਅੰਕਾਂ ਨੂੰ ਸਪਸ਼ਟ ਤੌਰ 'ਤੇ ਵੱਖ ਕਰੇ, ਅਤੇ ਇਸ ਲਈ ਕੁਝ ਗਲਤ ਵਰਗੀਕਰਨ ਦੇ ਮਾਮਲੇ ਹੁੰਦੇ ਹਨ।\n",
"\n",
"> ਇਸ ਕੋਰਸ ਦੇ ਅੱਗੇ ਅਸੀਂ ਸਿੱਖਾਂਗੇ ਕਿ ਨਿਊਰਲ ਨੈੱਟਵਰਕ ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਗੈਰ-ਰੇਖੀ ਵਰਗੀਕਰਨ ਕਿਵੇਂ ਬਣਾਈ ਜਾ ਸਕਦੀ ਹੈ, ਅਤੇ ਅੰਕਾਂ ਦੇ ਠੀਕ ਤਰੀਕੇ ਨਾਲ ਸਧਾਰਨ ਨਾ ਹੋਣ ਦੀ ਸਮੱਸਿਆ ਨਾਲ ਕਿਵੇਂ ਨਜਿੱਠਿਆ ਜਾ ਸਕਦਾ ਹੈ। ਬਹੁਤ ਜਲਦੀ ਅਸੀਂ MNIST ਅੰਕ ਵਰਗੀਕਰਨ ਵਿੱਚ 99% ਤੋਂ ਵੱਧ ਸਹੀ ਦਰਜਾ ਹਾਸਲ ਕਰ ਲਵਾਂਗੇ, ਜਦੋਂ ਅਸੀਂ ਉਨ੍ਹਾਂ ਨੂੰ 10 ਵੱਖ-ਵੱਖ ਵਰਗਾਂ ਵਿੱਚ ਵਰਗੀਕ੍ਰਿਤ ਕਰਾਂਗੇ।\n",
"> ਇਸ ਕੋਰਸ ਵਿੱਚ ਅੱਗੇ ਜਾ ਕੇ ਅਸੀਂ ਸਿੱਖਾਂਗੇ ਕਿ ਨਾਨ-ਲਿਨੀਅਰ ਵਰਗੀਕਰਨ ਕਰਨ ਵਾਲੇ ਨਿਊਰਲ ਨੈੱਟਵਰਕਸ ਕਿਵੇਂ ਬਣਾਉਣੇ ਹਨ, ਅਤੇ ਅੰਕਾਂ ਦੇ ਠੀਕ ਤਰੀਕੇ ਨਾਲ ਸੰਰਚਿਤ ਨਾ ਹੋਣ ਦੀ ਸਮੱਸਿਆ ਨਾਲ ਕਿਵੇਂ ਨਜਿੱਠਣਾ ਹੈ। ਬਹੁਤ ਜਲਦੀ ਅਸੀਂ MNIST ਅੰਕ ਵਰਗੀਕਰਨ ਵਿੱਚ 99% ਤੋਂ ਵੱਧ ਸਹੀ ਦਰਜਾ ਹਾਸਲ ਕਰ ਲਵਾਂਗੇ, ਜਦੋਂ ਅਸੀਂ ਉਨ੍ਹਾਂ ਨੂੰ 10 ਵੱਖ-ਵੱਖ ਵਰਗਾਂ ਵਿੱਚ ਵਰਗੀਕ੍ਰਿਤ ਕਰਾਂਗੇ।\n",
"\n",
"## ਸਿੱਖਿਆ\n",
"\n",
" * ਅਸੀਂ ਸਭ ਤੋਂ ਆਸਾਨ ਨਿਊਰਲ ਨੈੱਟਵਰਕ ਆਰਕੀਟੈਕਚਰ ਬਾਰੇ ਸਿੱਖਿਆ - ਇੱਕ-ਪਰਤ ਪਰਸੈਪਟ੍ਰਾਨ।\n",
" * ਅਸੀਂ ਪਰਸੈਪਟ੍ਰਾਨ ਨੂੰ \"ਹੱਥੋਂ\" ਲਾਗੂ ਕੀਤਾ, ਸਧਾਰ ਟ੍ਰੇਨਿੰਗ ਪ੍ਰਕਿਰਿਆ ਦੀ ਵਰਤੋਂ ਕਰਦੇ ਹੋਏ ਜੋ ਗ੍ਰੇਡੀਅੰਟ ਡਿਸੈਂਟ 'ਤੇ ਆਧਾਰਿਤ ਹੈ।\n",
" * ਸਧਾਰਨ ਹੋਣ ਦੇ ਬਾਵਜੂਦ, ਇੱਕ-ਪਰਤ ਪਰਸੈਪਟ੍ਰਾਨ ਹੱਥ ਨਾਲ ਲਿਖੇ ਅੰਕਾਂ ਦੀ ਪਛਾਣ ਦੇ ਕਾਫ਼ੀ ਜਟਿਲ ਸਮੱਸਿਆਵਾਂ ਨੂੰ ਹੱਲ ਕਰ ਸਕਦਾ ਹੈ।\n",
" * ਇੱਕ-ਪਰਤ ਪਰਸੈਪਟ੍ਰਾਨ ਇੱਕ ਰੇਖੀ ਵਰਗੀਕਰਤਾ ਹੈ, ਅਤੇ ਇਸ ਲਈ ਇਹ ਲਜਿਸਟਿਕ ਰਿਗ੍ਰੈਸ਼ਨ ਦੇ ਬਰਾਬਰ ਵਰਗੀਕਰਨ ਦੀ ਸਮਰੱਥਾ ਪ੍ਰਦਾਨ ਕਰਦਾ ਹੈ।\n",
" * ਅਸੀਂ ਸਭ ਤੋਂ ਸਧਾਰਣ ਨਿਊਰਲ ਨੈੱਟਵਰਕ ਆਰਕੀਟੈਕਚਰ ਬਾਰੇ ਸਿੱਖਿਆ - ਇੱਕ-ਪਰਤ ਪਰਸੈਪਟ੍ਰਾਨ।\n",
" * ਅਸੀਂ ਪਰਸੈਪਟ੍ਰਾਨ ਨੂੰ \"ਹੱਥੋਂ\" ਲਾਗੂ ਕੀਤਾ, ਸਧਾਰ ਟ੍ਰੇਨਿੰਗ ਪ੍ਰਕਿਰਿਆ ਦੀ ਵਰਤੋਂ ਕਰਦੇ ਹੋਏ ਜੋ ਗ੍ਰੇਡੀਅੰਟ ਡਿਸੈਂਟ 'ਤੇ ਆਧਾਰਿਤ ਹੈ।\n",
" * ਸਧਾਰਣਤਾ ਦੇ ਬਾਵਜੂਦ, ਇੱਕ-ਪਰਤ ਪਰਸੈਪਟ੍ਰਾਨ ਹੱਥੋਂ ਲਿਖੇ ਅੰਕਾਂ ਦੀ ਪਹਚਾਣ ਦੇ ਕਾਫ਼ੀ ਜਟਿਲ ਸਮੱਸਿਆਵਾਂ ਨੂੰ ਹੱਲ ਕਰ ਸਕਦਾ ਹੈ।\n",
" * ਇੱਕ-ਪਰਤ ਪਰਸੈਪਟ੍ਰਾਨ ਇੱਕ ਰੇਖੀ ਵਰਗੀਕਰਤਾ ਹੈ, ਅਤੇ ਇਸ ਲਈ ਇਹ ਲਜਿਸਟਿਕ ਰਿਗ੍ਰੈਸ਼ਨ ਦੇ ਬਰਾਬਰ ਵਰਗੀਕਰਨ ਦੀ ਸਮਰੱਥਾ ਪ੍ਰਦਾਨ ਕਰਦਾ ਹੈ।\n",
" * ਨਮੂਨਾ ਸਪੇਸ ਵਿੱਚ, ਪਰਸੈਪਟ੍ਰਾਨ ਹਾਈਪਰਪਲੇਨ ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਇਨਪੁਟ ਡਾਟਾ ਦੇ ਦੋ ਵਰਗਾਂ ਨੂੰ ਵੱਖ ਕਰ ਸਕਦਾ ਹੈ।\n"
]
},
@ -1049,7 +1053,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**ਅਸਵੀਕਰਤੀ**: \nਇਹ ਦਸਤਾਵੇਜ਼ AI ਅਨੁਵਾਦ ਸੇਵਾ [Co-op Translator](https://github.com/Azure/co-op-translator) ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਅਨੁਵਾਦ ਕੀਤਾ ਗਿਆ ਹੈ। ਜਦੋਂ ਕਿ ਅਸੀਂ ਸਹੀ ਹੋਣ ਦਾ ਯਤਨ ਕਰਦੇ ਹਾਂ, ਕਿਰਪਾ ਕਰਕੇ ਧਿਆਨ ਦਿਓ ਕਿ ਸਵੈਚਾਲਿਤ ਅਨੁਵਾਦਾਂ ਵਿੱਚ ਗਲਤੀਆਂ ਜਾਂ ਅਸੁੱਛਤਾਵਾਂ ਹੋ ਸਕਦੀਆਂ ਹਨ। ਇਸ ਦੀ ਮੂਲ ਭਾਸ਼ਾ ਵਿੱਚ ਮੌਜੂਦ ਮੂਲ ਦਸਤਾਵੇਜ਼ ਨੂੰ ਪ੍ਰਮਾਣਿਕ ਸਰੋਤ ਮੰਨਿਆ ਜਾਣਾ ਚਾਹੀਦਾ ਹੈ। ਮਹੱਤਵਪੂਰਨ ਜਾਣਕਾਰੀ ਲਈ, ਪੇਸ਼ੇਵਰ ਮਨੁੱਖੀ ਅਨੁਵਾਦ ਦੀ ਸਿਫਾਰਸ਼ ਕੀਤੀ ਜਾਂਦੀ ਹੈ। ਇਸ ਅਨੁਵਾਦ ਦੇ ਪ੍ਰਯੋਗ ਤੋਂ ਪੈਦਾ ਹੋਣ ਵਾਲੇ ਕਿਸੇ ਵੀ ਗਲਤਫਹਿਮੀ ਜਾਂ ਗਲਤ ਵਿਆਖਿਆ ਲਈ ਅਸੀਂ ਜ਼ਿੰਮੇਵਾਰ ਨਹੀਂ ਹਾਂ। \n"
"\n---\n\n**ਅਸਵੀਕਰਤੀ**: \nਇਹ ਦਸਤਾਵੇਜ਼ AI ਅਨੁਵਾਦ ਸੇਵਾ [Co-op Translator](https://github.com/Azure/co-op-translator) ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਅਨੁਵਾਦ ਕੀਤਾ ਗਿਆ ਹੈ। ਜਦੋਂ ਕਿ ਅਸੀਂ ਸਹੀ ਹੋਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰਦੇ ਹਾਂ, ਕਿਰਪਾ ਕਰਕੇ ਧਿਆਨ ਦਿਓ ਕਿ ਸਵੈਚਾਲਿਤ ਅਨੁਵਾਦਾਂ ਵਿੱਚ ਗਲਤੀਆਂ ਜਾਂ ਅਸੁਚੱਜੇਪਣ ਹੋ ਸਕਦੇ ਹਨ। ਇਸ ਦੀ ਮੂਲ ਭਾਸ਼ਾ ਵਿੱਚ ਮੂਲ ਦਸਤਾਵੇਜ਼ ਨੂੰ ਅਧਿਕਾਰਤ ਸਰੋਤ ਮੰਨਿਆ ਜਾਣਾ ਚਾਹੀਦਾ ਹੈ। ਮਹੱਤਵਪੂਰਨ ਜਾਣਕਾਰੀ ਲਈ, ਪੇਸ਼ੇਵਰ ਮਨੁੱਖੀ ਅਨੁਵਾਦ ਦੀ ਸਿਫਾਰਸ਼ ਕੀਤੀ ਜਾਂਦੀ ਹੈ। ਇਸ ਅਨੁਵਾਦ ਦੀ ਵਰਤੋਂ ਤੋਂ ਪੈਦਾ ਹੋਣ ਵਾਲੇ ਕਿਸੇ ਵੀ ਗਲਤ ਫਹਿਮੀ ਜਾਂ ਗਲਤ ਵਿਆਖਿਆ ਲਈ ਅਸੀਂ ਜ਼ਿੰਮੇਵਾਰ ਨਹੀਂ ਹਾਂ।\n"
]
}
],
@ -1078,8 +1082,8 @@
"start_slideshow_at": "selected"
},
"coopTranslator": {
"original_hash": "914fc55f59efc7e17b8130d4033ac617",
"translation_date": "2025-08-29T06:55:03+00:00",
"original_hash": "d67e5b54ba20b507aa88d71aa3d042d8",
"translation_date": "2025-10-03T13:21:28+00:00",
"source_file": "lessons/3-NeuralNetworks/03-Perceptron/Perceptron.ipynb",
"language_code": "pa"
}

View File

@ -49,7 +49,7 @@
"source": [
"## Problem zabawkowy\n",
"\n",
"Na początek zajmijmy się prostym problemem, w którym mamy dwa cechy wejściowe. Na przykład w medycynie możemy chcieć klasyfikować guzy jako łagodne lub złośliwe, w zależności od ich wielkości i wieku.\n",
"Na początek zajmijmy się problemem zabawkowym, w którym mamy dwa cechy wejściowe. Na przykład w medycynie możemy chcieć klasyfikować guzy jako łagodne lub złośliwe, w zależności od ich wielkości i wieku.\n",
"\n",
"Wygenerujemy losowy zestaw danych klasyfikacyjnych za pomocą funkcji `make_classification` z biblioteki SciKit Learn:\n"
]
@ -166,7 +166,7 @@
" \\end{cases} \\\\\n",
"$$\n",
"\n",
"Jednak ogólny model liniowy powinien również uwzględniać bias, czyli idealnie powinniśmy obliczać $y$ jako $y=f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}+\\mathbf{b})$. Aby uprościć nasz model, możemy pozbyć się tego składnika bias, dodając jeszcze jeden wymiar do naszych cech wejściowych, który zawsze będzie równy 1:\n"
"Jednakże ogólny model liniowy powinien również uwzględniać bias, czyli idealnie powinniśmy obliczać $y$ jako $y=f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}+\\mathbf{b})$. Aby uprościć nasz model, możemy pozbyć się tego biasu, dodając jeden dodatkowy wymiar do naszych cech wejściowych, który zawsze będzie równy 1:\n"
]
},
{
@ -213,7 +213,7 @@
" * $t_{n} \\in \\{-1, +1\\}$ dla negatywnych i pozytywnych próbek treningowych, odpowiednio\n",
" * $\\mathcal{M}$ - zbiór błędnie sklasyfikowanych przykładów\n",
" \n",
"Wykorzystamy proces **gradientowego spadku**. Zaczynając od początkowych losowych wag $\\mathbf{w}^{(0)}$, będziemy dostosowywać wagi na każdym kroku treningu, używając gradientu $E$:\n",
"Wykorzystamy proces **spadku gradientu**. Zaczynając od początkowych losowych wag $\\mathbf{w}^{(0)}$, będziemy dostosowywać wagi na każdym kroku treningu, używając gradientu $E$:\n",
"\n",
"$$\\mathbf{w}^{\\tau + 1}=\\mathbf{w}^{\\tau} - \\eta \\nabla E(\\mathbf{w}) = \\mathbf{w}^{\\tau} + \\eta\\sum_{n \\in \\mathcal{M}}\\mathbf{x}_{n} t_{n}$$\n",
"\n",
@ -271,7 +271,9 @@
{
"cell_type": "markdown",
"metadata": {},
"source": []
"source": [
"Teraz uruchommy trening na naszym zestawie danych:\n"
]
},
{
"cell_type": "code",
@ -311,7 +313,7 @@
"source": [
"Jak widać, początkowa dokładność wynosi około 50%, ale szybko wzrasta do wyższych wartości bliskich 90%.\n",
"\n",
"Zobaczmy, jak klasy są rozdzielane. Nasza funkcja klasyfikacyjna wygląda jak $\\mathbf{w}^Tx$, i jest większa od 0 dla jednej klasy, a mniejsza od 0 dla drugiej. W związku z tym linia rozdzielająca klasy jest zdefiniowana przez $\\mathbf{w}^Tx = 0$. Ponieważ mamy tylko dwa wymiary $x_0$ i $x_1$, równanie dla tej linii będzie wyglądać następująco: $w_0x_0+w_1x_1+w_2 = 0$ (pamiętaj, że jawnie zdefiniowaliśmy dodatkowy wymiar $x_2=1$). Narysujmy tę linię:\n"
"Zobaczmy, jak klasy są rozdzielane. Nasza funkcja klasyfikacji wygląda jak $\\mathbf{w}^Tx$, i jest większa niż 0 dla jednej klasy, a mniejsza niż 0 dla drugiej. W związku z tym linia rozdzielająca klasy jest zdefiniowana przez $\\mathbf{w}^Tx = 0$. Ponieważ mamy tylko dwa wymiary $x_0$ i $x_1$, równanie dla linii będzie wyglądać następująco: $w_0x_0+w_1x_1+w_2 = 0$ (pamiętaj, że jawnie zdefiniowaliśmy dodatkowy wymiar $x_2=1$). Narysujmy tę linię:\n"
]
},
{
@ -377,9 +379,9 @@
}
},
"source": [
"## Ocena na zestawie testowym\n",
"## Ocena na zbiorze testowym\n",
"\n",
"Na początku odłożyliśmy część danych do zestawu testowego. Sprawdźmy, jak dokładny jest nasz klasyfikator na tym zestawie testowym. Aby to zrobić, rozszerzamy również zestaw testowy o dodatkowy wymiar, mnożymy przez macierz wag i upewniamy się, że uzyskana wartość ma ten sam znak co etykieta (+1 lub -1). Następnie sumujemy wszystkie wartości logiczne i dzielimy przez długość próbki testowej, aby uzyskać dokładność:\n"
"Na początku odłożyliśmy część danych do zbioru testowego. Sprawdźmy, jak dokładny jest nasz klasyfikator na tym zbiorze testowym. Aby to zrobić, rozszerzamy zbiór testowy o dodatkowy wymiar, mnożymy przez macierz wag i upewniamy się, że uzyskana wartość ma ten sam znak co etykieta (+1 lub -1). Następnie sumujemy wszystkie wartości logiczne i dzielimy przez długość próbki testowej, aby uzyskać dokładność:\n"
]
},
{
@ -420,7 +422,7 @@
"source": [
"## Obserwowanie procesu treningu\n",
"\n",
"Widzieliśmy wcześniej, jak dokładność spada podczas treningu. Byłoby ciekawie zobaczyć, jak linia separacji zmienia się w trakcie treningu. Poniższy kod zwizualizuje wszystko na jednym wykresie, a Ty będziesz mógł przesuwać suwak, aby \"cofnąć się w czasie\" i prześledzić proces treningu.\n"
"Wcześniej zauważyliśmy, jak dokładność zmniejsza się podczas treningu. Byłoby interesujące zobaczyć, jak linia separacji zmienia się w trakcie treningu. Poniższy kod zwizualizuje wszystko na jednym wykresie, a Ty będziesz mógł przesuwać suwak, aby \"podróżować w czasie\" przez proces treningu.\n"
]
},
{
@ -527,9 +529,9 @@
"source": [
"## Ograniczenia perceptronu\n",
"\n",
"Jak widzieliście powyżej, perceptron jest **klasyfikatorem liniowym**. Potrafi dobrze rozróżniać dwie klasy, jeśli są one **liniowo separowalne**, tzn. można je oddzielić prostą linią. W przeciwnym razie proces uczenia perceptronu nie będzie zbieżny.\n",
"Jak widzieliście powyżej, perceptron jest **klasyfikatorem liniowym**. Potrafi dobrze rozróżniać dwie klasy, jeśli są one **liniowo separowalne**, czyli można je oddzielić prostą linią. W przeciwnym razie proces uczenia perceptronu nie będzie się zbiegał.\n",
"\n",
"Najbardziej oczywistym przykładem problemu, którego perceptron nie jest w stanie rozwiązać, jest tzw. **problem XOR**. Chcemy, aby nasz perceptron nauczył się funkcji logicznej XOR, która ma następującą tabelę prawdy:\n",
"Najbardziej oczywistym przykładem problemu, którego perceptron nie może rozwiązać, jest tak zwany **problem XOR**. Chcemy, aby nasz perceptron nauczył się funkcji logicznej XOR, która ma następującą tabelę prawdy:\n",
"\n",
"| | 0 | 1 |\n",
"|---|---|---|\n",
@ -605,13 +607,13 @@
"source": [
"Jak widać na powyższym wykresie, dokładność nigdy nie przekracza 75%, ponieważ nie da się narysować prostej linii w taki sposób, aby poprawnie sklasyfikować wszystkie możliwe przykłady.\n",
"\n",
"Problem XOR jest klasycznym przykładem ograniczeń perceptronu i został wskazany przez Marvina Minsky'ego i Seymoura Paperta w 1969 roku w ich książce [Perceptrons](https://en.wikipedia.org/wiki/Perceptrons_(book)). To spostrzeżenie zahamowało badania w dziedzinie sieci neuronowych na prawie 10 lat, mimo że - jak zobaczymy w następnej części naszego kursu - perceptrony wielowarstwowe są w pełni zdolne do rozwiązywania takich problemów.\n",
"Problem XOR jest klasycznym przykładem ograniczeń perceptronu i został wskazany przez Marvina Minsky'ego i Seymoura Paperta w 1969 roku w ich książce [Perceptrons](https://en.wikipedia.org/wiki/Perceptrons_(book)). To spostrzeżenie ograniczyło badania w dziedzinie sieci neuronowych na prawie 10 lat, mimo że - jak zobaczymy w następnej części naszego kursu - perceptrony wielowarstwowe są w pełni zdolne do rozwiązywania takich problemów.\n",
"\n",
"## Złożony przykład - MNIST\n",
"\n",
"Mimo że perceptron nie potrafi rozwiązać problemu XOR, może rozwiązywać wiele bardziej złożonych problemów, takich jak rozpoznawanie odręcznych znaków.\n",
"\n",
"Zbiór danych, który często jest używany podczas nauki maszynowej, nazywa się [MNIST](https://en.wikipedia.org/wiki/MNIST_database). Został stworzony przez Zmodyfikowany Narodowy Instytut Standardów i Technologii i zawiera zestaw treningowy składający się z 60000 odręcznych cyfr, zebranych od około 250 studentów i pracowników instytutu. Istnieje również zestaw testowy zawierający 10000 cyfr, zebranych od innych osób.\n",
"Zbiorem danych, który często jest używany podczas nauki maszynowej, jest [MNIST](https://en.wikipedia.org/wiki/MNIST_database). Został on stworzony przez zmodyfikowany Narodowy Instytut Standaryzacji i Technologii (Modified National Institute of Standards and Technology) i zawiera zestaw treningowy składający się z 60 000 odręcznych cyfr, zebranych od około 250 studentów i pracowników instytutu. Istnieje również zestaw testowy zawierający 10 000 cyfr, zebranych od innych osób.\n",
"\n",
"Wszystkie cyfry są przedstawione w postaci obrazów w skali szarości o rozmiarze 28x28 pikseli.\n",
"\n",
@ -642,7 +644,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Teraz narysujmy wykres dla zestawu danych:\n"
"Teraz narysujmy zestaw danych:\n"
]
},
{
@ -829,13 +831,13 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Zauważ, jak dokładność bardzo szybko osiąga niemal 100%.\n",
"Zauważ, jak dokładność bardzo szybko wzrasta prawie do 100%.\n",
"\n",
"Proszę, przesuń suwak w stronę końca treningu i zaobserwuj macierz wag wyświetloną po lewej stronie. Ta macierz pozwoli Ci zrozumieć, jak działa perceptron. Możesz zauważyć wysokie wartości wag w środkowej części pola, które odpowiadają pikselom typowo obecnym dla cyfry 1, oraz niskie, ujemne wartości po bokach, gdzie znajdują się części cyfry 0. Zatem, jeśli perceptronowi zostanie przedstawiona cyfra 1, jej środkowa część zostanie pomnożona przez wysokie wartości, co da wynik dodatni. Natomiast, gdy perceptron zobaczy cyfrę 0, odpowiadające jej piksele zostaną pomnożone przez liczby ujemne.\n",
"Proszę, przesuń suwak na pozycję pod koniec treningu i obserwuj macierz wagową wyświetlaną po lewej stronie. Ta macierz pozwoli Ci zrozumieć, jak perceptron faktycznie działa. Możesz zobaczyć wysokie wartości wagowe w środku pola, które odpowiadają pikselom typowo obecnym dla cyfry 1, oraz niskie wartości ujemne po bokach, gdzie znajdują się części cyfry 0. Tak więc, jeśli cyfra przedstawiona perceptronowi to faktycznie 1, jej środkowa część zostanie pomnożona przez wysokie wartości, dając wynik dodatni. Natomiast, gdy perceptron widzi cyfrę 0, odpowiadające jej piksele zostaną pomnożone przez liczby ujemne.\n",
"\n",
"> Możesz zauważyć, że jeśli podamy perceptronowi cyfrę 1, która jest nieco przesunięta poziomo, tak że jej piksele zajmują miejsce, gdzie znajdują się pionowe części cyfry 0, możemy otrzymać niepoprawny wynik. Wynika to z faktu, że dane w naszym zbiorze MNIST są tak skonstruowane, że wszystkie cyfry są wyśrodkowane i odpowiednio ustawione, a perceptron opiera się na tym, aby rozróżniać cyfry.\n",
"> Możesz zauważyć, że jeśli podamy perceptronowi cyfrę 1 nieco przesuniętą poziomo, tak że jej piksele zajmą miejsce, gdzie znajdują się pionowe części cyfry 0, możemy otrzymać niepoprawny wynik. Wynika to z natury naszego zbioru danych MNIST, w którym wszystkie cyfry są wyśrodkowane i odpowiednio ustawione, a perceptron opiera się na tym, aby rozróżniać cyfry.\n",
"\n",
"Teraz spróbujmy z innymi cyframi:\n"
"Teraz spróbujmy z różnymi cyframi:\n"
]
},
{
@ -911,11 +913,11 @@
"source": [
"## Dyskusja\n",
"\n",
"Z jakiegoś powodu, 2 i 5 nie są tak łatwo rozróżnialne. Mimo że uzyskujemy stosunkowo wysoką dokładność (powyżej 85%), wyraźnie widać, że perceptron przestaje się uczyć w pewnym momencie.\n",
"Z jakiegoś powodu cyfry 2 i 5 nie są łatwo rozróżnialne. Mimo że uzyskujemy stosunkowo wysoką dokładność (powyżej 85%), wyraźnie widać, że perceptron przestaje się uczyć w pewnym momencie.\n",
"\n",
"Aby zrozumieć, dlaczego tak się dzieje, możemy spróbować użyć [Analizy Głównych Składowych](https://pl.wikipedia.org/wiki/Analiza_g%C5%82%C3%B3wnych_sk%C5%82adowych) (PCA). Jest to technika uczenia maszynowego stosowana do zmniejszania wymiarowości zbioru danych wejściowych w taki sposób, aby uzyskać jak najlepszą separację między klasami.\n",
"Aby zrozumieć, dlaczego tak się dzieje, możemy spróbować użyć [Analizy Głównych Składników](https://en.wikipedia.org/wiki/Principal_component_analysis) (PCA). Jest to technika uczenia maszynowego, która pozwala na zmniejszenie wymiarowości danych wejściowych w taki sposób, aby uzyskać najlepszą separowalność między klasami.\n",
"\n",
"W naszym przypadku obraz wejściowy ma 784 piksele (cechy wejściowe), a my chcemy użyć PCA, aby zredukować liczbę parametrów do zaledwie 2, tak aby można je było przedstawić na wykresie. Te dwa parametry byłyby liniową kombinacją oryginalnych cech, a cały proces można postrzegać jako \"obracanie\" naszej pierwotnej przestrzeni 784-wymiarowej i obserwowanie jej projekcji na przestrzeń 2D, aż uzyskamy najlepszy widok, który oddziela klasy.\n"
"W naszym przypadku obraz wejściowy ma 784 piksele (cechy wejściowe), a my chcemy użyć PCA, aby zredukować liczbę parametrów do zaledwie 2, tak aby można było je przedstawić na wykresie. Te dwa parametry będą liniową kombinacją oryginalnych cech, a cały proces można postrzegać jako \"obracanie\" naszej pierwotnej przestrzeni 784-wymiarowej i obserwowanie jej projekcji na przestrzeń 2D, aż uzyskamy najlepszy widok, który rozdziela klasy.\n"
]
},
{
@ -1025,13 +1027,13 @@
}
},
"source": [
"Jak widać, cyfry 0 i 1 można wyraźnie oddzielić prostą linią. Oznacza to, że w oryginalnej przestrzeni o wymiarze 784 punkty odpowiadające cyfrom są również liniowo separowalne. W przypadku cyfr 2 i 5 nie możemy znaleźć odpowiedniej projekcji, która wyraźnie oddzieli cyfry, co prowadzi do pewnych przypadków błędnej klasyfikacji.\n",
"Jak widać, cyfry 0 i 1 można wyraźnie oddzielić za pomocą prostej linii. Wskazuje to, że w oryginalnej przestrzeni 784-wymiarowej punkty odpowiadające cyfrom są również liniowo separowalne. W przypadku cyfr 2 i 5 nie możemy znaleźć odpowiedniej projekcji, która wyraźnie oddzieli te cyfry, co prowadzi do pewnych przypadków błędnej klasyfikacji.\n",
"\n",
"> W dalszej części tego kursu nauczymy się, jak tworzyć nieliniowe klasyfikatory za pomocą sieci neuronowych oraz jak radzić sobie z problemem nieprawidłowego wyrównania cyfr. Już wkrótce osiągniemy ponad 99% dokładności w klasyfikacji cyfr MNIST, klasyfikując je do 10 różnych klas.\n",
"> W dalszej części tego kursu nauczymy się tworzyć nieliniowe klasyfikatory za pomocą sieci neuronowych oraz radzić sobie z problemem nieprawidłowego wyrównania cyfr. Już wkrótce osiągniemy ponad 99% dokładności w klasyfikacji cyfr MNIST, klasyfikując je do 10 różnych klas.\n",
"\n",
"## Wnioski\n",
"\n",
" * Nauczyliśmy się o najprostszej architekturze sieci neuronowej - perceptronie jednowarstwowym.\n",
" * Poznaliśmy najprostszą architekturę sieci neuronowej - perceptron jednowarstwowy.\n",
" * Zaimplementowaliśmy perceptron \"ręcznie\", korzystając z prostego procesu uczenia opartego na metodzie gradientu.\n",
" * Pomimo swojej prostoty, perceptron jednowarstwowy potrafi rozwiązywać dość złożone problemy rozpoznawania odręcznie pisanych cyfr.\n",
" * Perceptron jednowarstwowy jest klasyfikatorem liniowym, co oznacza, że ma taką samą moc klasyfikacyjną jak regresja logistyczna.\n",
@ -1044,7 +1046,7 @@
"source": [
"## Podziękowania\n",
"\n",
"Ten notatnik jest częścią [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners) i został przygotowany przez [Dmitry Soshnikov](http://soshnikov.com). Inspiracją dla niego były warsztaty dotyczące sieci neuronowych w Microsoft Research Cambridge. Niektóre fragmenty kodu oraz materiały ilustracyjne pochodzą z prezentacji przygotowanych przez [Katja Hoffmann](https://www.microsoft.com/en-us/research/people/kahofman/), [Matthew Johnson](https://www.microsoft.com/en-us/research/people/matjoh/) oraz [Ryoto Tomioka](https://www.microsoft.com/en-us/research/people/ryoto/), a także z repozytorium [NeuroWorkshop](http://github.com/shwars/NeuroWorkshop).\n"
"Ten notatnik jest częścią [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners) i został przygotowany przez [Dmitry Soshnikov](http://soshnikov.com). Inspiracją dla niego były warsztaty dotyczące sieci neuronowych w Microsoft Research Cambridge. Niektóre fragmenty kodu oraz materiały ilustracyjne pochodzą z prezentacji przygotowanych przez [Katję Hoffmann](https://www.microsoft.com/en-us/research/people/kahofman/), [Matthew Johnsona](https://www.microsoft.com/en-us/research/people/matjoh/) oraz [Ryoto Tomiokę](https://www.microsoft.com/en-us/research/people/ryoto/), a także z repozytorium [NeuroWorkshop](http://github.com/shwars/NeuroWorkshop).\n"
]
},
{
@ -1080,8 +1082,8 @@
"start_slideshow_at": "selected"
},
"coopTranslator": {
"original_hash": "914fc55f59efc7e17b8130d4033ac617",
"translation_date": "2025-08-31T13:25:01+00:00",
"original_hash": "d67e5b54ba20b507aa88d71aa3d042d8",
"translation_date": "2025-10-03T13:25:14+00:00",
"source_file": "lessons/3-NeuralNetworks/03-Perceptron/Perceptron.ipynb",
"language_code": "pl"
}

View File

@ -11,9 +11,9 @@
"source": [
"## Perceptron\n",
"\n",
"> Este notebook faz parte do [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners). Visite o repositório para o conjunto completo de materiais de aprendizagem.\n",
"> Este notebook faz parte do [Currículo de IA para Iniciantes](http://github.com/microsoft/ai-for-beginners). Visite o repositório para o conjunto completo de materiais de aprendizagem.\n",
"\n",
"Como discutimos, o perceptron permite resolver um **problema de classificação binária**, ou seja, classificar exemplos de entrada em duas classes - podemos chamá-las de **positiva** e **negativa**.\n",
"Como discutimos, o perceptron permite resolver o **problema de classificação binária**, ou seja, classificar exemplos de entrada em duas classes - podemos chamá-las de **positiva** e **negativa**.\n",
"\n",
"Primeiro, vamos importar algumas bibliotecas necessárias.\n"
]
@ -49,9 +49,9 @@
"source": [
"## Problema Simples\n",
"\n",
"Para começar, vamos abordar um problema simples, onde temos duas características de entrada. Por exemplo, na medicina, podemos querer classificar tumores como benignos ou malignos, dependendo do seu tamanho e idade.\n",
"Para começar, vamos iniciar com um problema simples, onde temos duas características de entrada. Por exemplo, na medicina, podemos querer classificar tumores como benignos ou malignos, dependendo do seu tamanho e idade.\n",
"\n",
"Vamos gerar um conjunto de dados de classificação aleatório utilizando a função `make_classification` da biblioteca SciKit Learn:\n"
"Vamos gerar um conjunto de dados de classificação aleatório usando a função `make_classification` da biblioteca SciKit Learn:\n"
]
},
{
@ -95,7 +95,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Vamos também plotar o conjunto de dados:\n"
"Vamos também representar graficamente o conjunto de dados:\n"
]
},
{
@ -154,11 +154,11 @@
"source": [
"## Perceptron\n",
"\n",
"Como o perceptron é um classificador binário, para cada vetor de entrada $x$, o resultado do nosso perceptron será +1 ou -1, dependendo da classe. O resultado será calculado utilizando a fórmula\n",
"Como o perceptron é um classificador binário, para cada vetor de entrada $x$, a saída do nosso perceptron será +1 ou -1, dependendo da classe. A saída será calculada utilizando a fórmula\n",
"\n",
"$$y(\\mathbf{x}) = f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x})$$\n",
"\n",
"onde $\\mathbf{w}$ é um vetor de pesos, e $f$ é uma função de ativação em degrau:\n",
"onde $\\mathbf{w}$ é um vetor de pesos, e $f$ é uma função de ativação degrau:\n",
"$$\n",
"f(x) = \\begin{cases}\n",
" +1 & x \\geq 0 \\\\\n",
@ -271,7 +271,9 @@
{
"cell_type": "markdown",
"metadata": {},
"source": []
"source": [
"Agora vamos executar o treino no nosso conjunto de dados:\n"
]
},
{
"cell_type": "code",
@ -309,9 +311,9 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Como pode ver, a precisão inicial é cerca de 50%, mas aumenta rapidamente para valores mais elevados próximos de 90%.\n",
"Como pode ver, a precisão inicial é cerca de 50%, mas aumenta rapidamente para valores mais elevados, próximos de 90%.\n",
"\n",
"Vamos visualizar como as classes estão separadas. A nossa função de classificação tem a forma $\\mathbf{w}^Tx$, e é maior que 0 para uma classe e menor que 0 para outra. Assim, a linha de separação das classes é definida por $\\mathbf{w}^Tx = 0$. Como temos apenas duas dimensões $x_0$ e $x_1$, a equação da linha seria $w_0x_0+w_1x_1+w_2 = 0$ (lembre-se de que definimos explicitamente uma dimensão extra $x_2=1$). Vamos representar esta linha:\n"
"Vamos visualizar como as classes estão separadas. A nossa função de classificação tem a forma $\\mathbf{w}^Tx$, sendo maior que 0 para uma classe e menor que 0 para outra. Assim, a linha de separação das classes é definida por $\\mathbf{w}^Tx = 0$. Como temos apenas duas dimensões, $x_0$ e $x_1$, a equação da linha seria $w_0x_0+w_1x_1+w_2 = 0$ (lembre-se de que definimos explicitamente uma dimensão extra $x_2=1$). Vamos representar esta linha:\n"
]
},
{
@ -379,7 +381,7 @@
"source": [
"## Avaliar no Conjunto de Dados de Teste\n",
"\n",
"No início, reservámos alguns dados para o conjunto de teste. Vamos verificar quão preciso é o nosso classificador neste conjunto de teste. Para isso, expandimos o conjunto de teste com uma dimensão extra, multiplicamos pela matriz de pesos e garantimos que o valor obtido tem o mesmo sinal que o rótulo (+1 ou -1). De seguida, somamos todos os valores booleanos e dividimos pelo tamanho da amostra de teste para obter a precisão:\n"
"No início, reservámos alguns dados para o conjunto de teste. Vamos verificar quão preciso é o nosso classificador neste conjunto de teste. Para isso, expandimos o conjunto de teste com uma dimensão extra, multiplicamos pela matriz de pesos e garantimos que o valor obtido tem o mesmo sinal que o rótulo (+1 ou -1). Depois somamos todos os valores booleanos e dividimos pelo tamanho da amostra de teste para obter a precisão:\n"
]
},
{
@ -420,7 +422,7 @@
"source": [
"## Observando o processo de treino\n",
"\n",
"Já vimos anteriormente como a precisão diminui durante o treino. Seria interessante observar como a linha de separação se comporta durante o treino. O código abaixo irá visualizar tudo num único gráfico, e deverá ser possível mover o cursor para \"viajar no tempo\" ao longo do processo de treino.\n"
"Já vimos anteriormente como a precisão diminui durante o treino. Seria interessante observar como a linha de separação se comporta durante o treino. O código abaixo irá visualizar tudo num único gráfico, e deverá ser possível mover o cursor para \"viajar no tempo\" através do processo de treino.\n"
]
},
{
@ -527,9 +529,9 @@
"source": [
"## Limitações do Perceptron\n",
"\n",
"Como visto acima, o perceptron é um **classificador linear**. Ele consegue distinguir bem entre duas classes se forem **linearmente separáveis**, ou seja, se puderem ser separadas por uma linha reta. Caso contrário, o processo de treino do perceptron não irá convergir.\n",
"Como visto acima, o perceptron é um **classificador linear**. Ele consegue distinguir bem entre duas classes se estas forem **linearmente separáveis**, ou seja, se puderem ser separadas por uma linha reta. Caso contrário, o processo de treino do perceptron não irá convergir.\n",
"\n",
"Um exemplo claro de um problema que não pode ser resolvido por um perceptron é o chamado **problema XOR**. Queremos que o nosso perceptron aprenda a função booleana XOR, que possui a seguinte tabela de verdade:\n",
"Um exemplo evidente de um problema que não pode ser resolvido por um perceptron é o chamado **problema XOR**. Queremos que o nosso perceptron aprenda a função booleana XOR, que possui a seguinte tabela de verdade:\n",
"\n",
"| | 0 | 1 |\n",
"|---|---|---|\n",
@ -609,13 +611,13 @@
"\n",
"## Exemplo Complexo - MNIST\n",
"\n",
"Embora o perceptrão não consiga resolver o problema XOR, ele pode resolver problemas muito mais complexos, como o reconhecimento de caracteres manuscritos.\n",
"Embora o perceptrão não consiga resolver o problema XOR, consegue resolver problemas muito mais complexos, como o reconhecimento de caracteres manuscritos.\n",
"\n",
"Um conjunto de dados frequentemente utilizado para dominar o aprendizado de máquina chama-se [MNIST](https://en.wikipedia.org/wiki/MNIST_database). Foi criado pelo Instituto Nacional de Padrões e Tecnologia Modificado e contém um conjunto de treino com 60.000 dígitos manuscritos, recolhidos de cerca de 250 estudantes e funcionários do instituto. Existe também um conjunto de teste com 10.000 dígitos, recolhidos de diferentes indivíduos.\n",
"Um conjunto de dados frequentemente utilizado para aprender machine learning chama-se [MNIST](https://en.wikipedia.org/wiki/MNIST_database). Foi criado pelo Instituto Nacional de Padrões e Tecnologia Modificado e contém um conjunto de treino com 60.000 dígitos manuscritos, recolhidos de cerca de 250 estudantes e funcionários do instituto. Existe também um conjunto de teste com 10.000 dígitos, recolhidos de diferentes indivíduos.\n",
"\n",
"Todos os dígitos são representados por imagens em escala de cinza com tamanho de 28x28 pixels.\n",
"\n",
"> O conjunto de dados MNIST está disponível como uma competição de treino no [Kaggle](https://www.kaggle.com/c/digit-recognizer), um site que organiza competições e concursos de aprendizado de máquina. Assim que aprender a classificar os dígitos do MNIST, pode submeter a sua solução ao Kaggle para ver como é avaliada entre outros participantes.\n",
"> O conjunto de dados MNIST está disponível como uma competição de treino no [Kaggle](https://www.kaggle.com/c/digit-recognizer), um site que organiza competições e concursos de machine learning. Assim que aprender a classificar os dígitos MNIST, pode submeter a sua solução no Kaggle para ver como é classificada entre outros participantes.\n",
"\n",
"Começamos por carregar o conjunto de dados MNIST:\n"
]
@ -693,7 +695,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Porque o perceptron é um classificador binário, iremos limitar o nosso problema ao reconhecimento de apenas dois dígitos. A função abaixo irá preencher os arrays de amostras positivas e negativas com dois dígitos dados (e também mostrará amostras desses dígitos para maior clareza).\n"
"Porque o perceptrão é um classificador binário, iremos limitar o nosso problema ao reconhecimento de apenas dois dígitos. A função abaixo irá preencher os arrays de amostras positivas e negativas com dois dígitos dados (e também mostrará amostras desses dígitos para maior clareza).\n"
]
},
{
@ -829,13 +831,13 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Por favor, note como a precisão aumenta quase 100% muito rapidamente.\n",
"Por favor, note como a precisão aumenta para quase 100% muito rapidamente.\n",
"\n",
"Por favor, mova o cursor para uma posição mais próxima do final do treino e observe a matriz de pesos plotada à esquerda. Esta matriz permitirá que você entenda como o perceptron realmente funciona. Pode-se ver os valores altos de peso no meio do campo, que correspondem a pixels que geralmente estão presentes no dígito 1, e valores negativos baixos nas laterais, onde estão partes do dígito 0. Assim, se o dígito apresentado ao perceptron for de fato 1, a parte central será multiplicada por valores altos, produzindo um resultado positivo. Por outro lado, quando o perceptron observa o dígito 0, os pixels correspondentes serão multiplicados por números negativos.\n",
"Por favor, mova o cursor para uma posição próxima ao final do treino e observe a matriz de pesos representada à esquerda. Esta matriz permitirá que compreenda como o perceptrão realmente funciona. Pode ver os valores altos de peso no meio do campo, que correspondem a píxeis que normalmente estão presentes no dígito 1, e valores negativos baixos nas extremidades, onde estão partes do dígito 0. Assim, se o dígito apresentado ao perceptrão for de facto 1, a parte central será multiplicada por valores altos, produzindo um resultado positivo. Por outro lado, quando o perceptrão observa o dígito 0, os píxeis correspondentes serão multiplicados por números negativos.\n",
"\n",
"> Pode reparar que, se dermos ao perceptron um dígito 1 ligeiramente deslocado horizontalmente, de forma que seus pixels ocupem o lugar onde há partes verticais do dígito 0, podemos obter um resultado incorreto. Como a natureza do nosso conjunto de dados MNIST é tal que todos os dígitos estão centralizados e posicionados corretamente, o perceptron depende disso para distinguir entre os dígitos.\n",
"> Pode reparar que, se dermos ao perceptrão um dígito 1 ligeiramente deslocado horizontalmente, de forma que os seus píxeis ocupem o lugar onde há partes verticais do dígito 0, podemos obter um resultado incorreto. Isto acontece porque a natureza do nosso conjunto de dados MNIST é tal que todos os dígitos estão centrados e posicionados corretamente, e o perceptrão depende disso para distinguir entre os dígitos.\n",
"\n",
"Agora vamos experimentar diferentes dígitos:\n"
"Agora vamos experimentar com dígitos diferentes:\n"
]
},
{
@ -911,11 +913,11 @@
"source": [
"## Discussão\n",
"\n",
"Por alguma razão, 2 e 5 não são tão facilmente separáveis. Apesar de obtermos uma precisão relativamente alta (acima de 85%), é evidente que o perceptron para de aprender em determinado momento.\n",
"Por alguma razão, 2 e 5 não são tão facilmente separáveis. Apesar de obtermos uma precisão relativamente alta (acima de 85%), é evidente que o perceptron deixa de aprender a partir de certo ponto.\n",
"\n",
"Para entender por que isso acontece, podemos tentar usar [Análise de Componentes Principais](https://en.wikipedia.org/wiki/Principal_component_analysis) (PCA). Trata-se de uma técnica de aprendizagem automática utilizada para reduzir a dimensionalidade do conjunto de dados de entrada, de forma a obter a melhor separabilidade entre classes.\n",
"Para entender por que isso acontece, podemos tentar usar [Análise de Componentes Principais](https://en.wikipedia.org/wiki/Principal_component_analysis) (PCA). Trata-se de uma técnica de aprendizagem automática utilizada para reduzir a dimensionalidade do conjunto de dados de entrada, de forma a obter a melhor separação entre classes.\n",
"\n",
"No nosso caso, uma imagem de entrada tem 784 pixels (características de entrada), e queremos usar o PCA para reduzir o número de parâmetros para apenas 2, de modo a podermos representá-los num gráfico. Esses dois parâmetros seriam uma combinação linear das características originais, e podemos encarar este procedimento como uma \"rotação\" do nosso espaço original de 784 dimensões e observar a sua projeção no espaço 2D, até obtermos a melhor visualização que separa as classes.\n"
"No nosso caso, uma imagem de entrada tem 784 pixels (características de entrada), e queremos usar o PCA para reduzir o número de parâmetros para apenas 2, de modo a representá-los num gráfico. Esses dois parâmetros seriam uma combinação linear das características originais, e podemos encarar este procedimento como uma \"rotação\" do nosso espaço original de 784 dimensões, observando a sua projeção no espaço 2D, até obtermos a melhor visualização que separa as classes.\n"
]
},
{
@ -1027,15 +1029,15 @@
"source": [
"Como pode ver, 0 e 1 podem ser claramente separados por uma linha reta. Isto indica que, no espaço original de 784 dimensões, os pontos correspondentes aos dígitos também são linearmente separáveis. No caso de 2 e 5, não conseguimos encontrar uma boa projeção que separe os dígitos claramente, e, por isso, há alguns casos de classificação errada.\n",
"\n",
"> Mais tarde neste curso, iremos aprender como criar classificadores não lineares utilizando Redes Neuronais e como lidar com o problema de dígitos que não estão devidamente alinhados. Muito em breve, alcançaremos uma precisão acima de 99% na classificação de dígitos MNIST, enquanto os classificamos em 10 classes diferentes.\n",
"> Mais tarde neste curso, aprenderemos como criar classificadores não lineares usando Redes Neurais e como lidar com o problema de dígitos que não estão devidamente alinhados. Muito em breve, alcançaremos mais de 99% de precisão na classificação de dígitos MNIST, enquanto os classificamos em 10 diferentes classes.\n",
"\n",
"## Conclusões\n",
"\n",
" * Aprendemos sobre a arquitetura mais simples de rede neural - o perceptrão de uma camada.\n",
" * Implementámos o perceptrão \"manualmente\", utilizando um procedimento de treino simples baseado no gradiente descendente.\n",
" * Apesar da simplicidade, o perceptrão de uma camada consegue resolver problemas relativamente complexos de reconhecimento de dígitos manuscritos.\n",
" * O perceptrão de uma camada é um classificador linear e, por isso, oferece o mesmo poder de classificação que a regressão logística.\n",
" * No espaço amostral, o perceptrão pode separar duas classes de dados de entrada utilizando um hiperplano.\n"
" * Aprendemos sobre a arquitetura mais simples de rede neural - o perceptron de uma camada.\n",
" * Implementámos o perceptron \"manualmente\", utilizando um procedimento de treino simples baseado no gradiente descendente.\n",
" * Apesar da simplicidade, o perceptron de uma camada consegue resolver problemas bastante complexos de reconhecimento de dígitos manuscritos.\n",
" * O perceptron de uma camada é um classificador linear e, por isso, oferece o mesmo poder de classificação que a regressão logística.\n",
" * No espaço de amostras, o perceptron pode separar duas classes de dados de entrada utilizando um hiperplano.\n"
]
},
{
@ -1044,14 +1046,14 @@
"source": [
"## Créditos\n",
"\n",
"Este notebook faz parte do [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners) e foi preparado por [Dmitry Soshnikov](http://soshnikov.com). É inspirado no Workshop de Redes Neurais da Microsoft Research Cambridge. Parte do código e dos materiais ilustrativos foram retirados de apresentações de [Katja Hoffmann](https://www.microsoft.com/en-us/research/people/kahofman/), [Matthew Johnson](https://www.microsoft.com/en-us/research/people/matjoh/) e [Ryoto Tomioka](https://www.microsoft.com/en-us/research/people/ryoto/), bem como do repositório [NeuroWorkshop](http://github.com/shwars/NeuroWorkshop).\n"
"Este notebook faz parte do [Currículo de IA para Iniciantes](http://github.com/microsoft/ai-for-beginners) e foi preparado por [Dmitry Soshnikov](http://soshnikov.com). É inspirado no Workshop de Redes Neuronais da Microsoft Research Cambridge. Parte do código e dos materiais ilustrativos foram retirados de apresentações de [Katja Hoffmann](https://www.microsoft.com/en-us/research/people/kahofman/), [Matthew Johnson](https://www.microsoft.com/en-us/research/people/matjoh/) e [Ryoto Tomioka](https://www.microsoft.com/en-us/research/people/ryoto/), bem como do repositório [NeuroWorkshop](http://github.com/shwars/NeuroWorkshop).\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Aviso Legal**: \nEste documento foi traduzido utilizando o serviço de tradução por IA [Co-op Translator](https://github.com/Azure/co-op-translator). Embora nos esforcemos para garantir a precisão, é importante notar que traduções automáticas podem conter erros ou imprecisões. O documento original na sua língua nativa deve ser considerado a fonte autoritária. Para informações críticas, recomenda-se a tradução profissional realizada por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações incorretas decorrentes da utilização desta tradução.\n"
"\n---\n\n**Aviso**: \nEste documento foi traduzido utilizando o serviço de tradução por IA [Co-op Translator](https://github.com/Azure/co-op-translator). Embora nos esforcemos pela precisão, é importante notar que traduções automáticas podem conter erros ou imprecisões. O documento original na sua língua nativa deve ser considerado a fonte autoritária. Para informações críticas, recomenda-se uma tradução profissional realizada por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações incorretas decorrentes da utilização desta tradução.\n"
]
}
],
@ -1080,8 +1082,8 @@
"start_slideshow_at": "selected"
},
"coopTranslator": {
"original_hash": "914fc55f59efc7e17b8130d4033ac617",
"translation_date": "2025-08-31T11:50:40+00:00",
"original_hash": "d67e5b54ba20b507aa88d71aa3d042d8",
"translation_date": "2025-10-03T13:22:23+00:00",
"source_file": "lessons/3-NeuralNetworks/03-Perceptron/Perceptron.ipynb",
"language_code": "pt"
}

View File

@ -11,9 +11,9 @@
"source": [
"## Perceptron\n",
"\n",
"> Acest notebook face parte din [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners). Vizitează depozitul pentru setul complet de materiale de învățare.\n",
"> Acest notebook face parte din [Curricula AI pentru Începători](http://github.com/microsoft/ai-for-beginners). Vizitați depozitul pentru setul complet de materiale de învățare.\n",
"\n",
"Așa cum am discutat, perceptronul îți permite să rezolvi problema de **clasificare binară**, adică să clasifici exemplele de intrare în două clase - le putem numi **pozitive** și **negative**.\n",
"Așa cum am discutat, perceptronul vă permite să rezolvați **problema clasificării binare**, adică să clasificați exemplele de intrare în două clase - le putem numi **pozitive** și **negative**.\n",
"\n",
"Mai întâi, să importăm câteva biblioteci necesare.\n"
]
@ -49,7 +49,7 @@
"source": [
"## Problemă Simplă\n",
"\n",
"Pentru început, să începem cu o problemă simplă, unde avem două caracteristici de intrare. De exemplu, în medicină, am putea dori să clasificăm tumorile în benigne și maligne, în funcție de mărimea și vârsta lor.\n",
"Pentru început, să începem cu o problemă simplă, unde avem două caracteristici de intrare. De exemplu, în medicină, am putea dori să clasificăm tumorile în benigne și maligne, în funcție de mărimea și vârsta acestora.\n",
"\n",
"Vom genera un set de date de clasificare aleatoriu folosind funcția `make_classification` din biblioteca SciKit Learn:\n"
]
@ -158,7 +158,7 @@
"\n",
"$$y(\\mathbf{x}) = f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x})$$\n",
"\n",
"unde $\\mathbf{w}$ este un vector de ponderi, iar $f$ este o funcție de activare treaptă:\n",
"unde $\\mathbf{w}$ este un vector de greutăți, iar $f$ este o funcție de activare treaptă:\n",
"$$\n",
"f(x) = \\begin{cases}\n",
" +1 & x \\geq 0 \\\\\n",
@ -166,7 +166,7 @@
" \\end{cases} \\\\\n",
"$$\n",
"\n",
"Totuși, un model liniar generic ar trebui să aibă și un termen de bias, adică, ideal, ar trebui să calculăm $y$ ca $y=f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}+\\mathbf{b})$. Pentru a simplifica modelul nostru, putem elimina acest termen de bias adăugând o dimensiune suplimentară la caracteristicile noastre de intrare, care este întotdeauna egală cu 1:\n"
"Totuși, un model liniar generic ar trebui să aibă și un termen de bias, adică ideal ar fi să calculăm $y$ ca $y=f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}+\\mathbf{b})$. Pentru a simplifica modelul nostru, putem elimina acest termen de bias prin adăugarea unei dimensiuni suplimentare la caracteristicile de intrare, care va fi întotdeauna egală cu 1:\n"
]
},
{
@ -210,7 +210,7 @@
"\n",
"$$E(\\mathbf{w}) = -\\sum_{n \\in \\mathcal{M}}\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}_{n}t_{n}$$\n",
" \n",
" * $t_{n} \\in \\{-1, +1\\}$ pentru exemplele negative și pozitive de antrenament, respectiv\n",
" * $t_{n} \\in \\{-1, +1\\}$ pentru exemplele de antrenament negative și pozitive, respectiv\n",
" * $\\mathcal{M}$ - un set de exemple clasificate greșit\n",
" \n",
"Vom folosi procesul de **descendentă a gradientului**. Începând cu niște greutăți inițiale aleatorii $\\mathbf{w}^{(0)}$, vom ajusta greutățile la fiecare pas al antrenamentului folosind gradientul lui $E$:\n",
@ -271,7 +271,9 @@
{
"cell_type": "markdown",
"metadata": {},
"source": []
"source": [
"Acum să rulăm antrenamentul pe setul nostru de date:\n"
]
},
{
"cell_type": "code",
@ -309,9 +311,9 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"După cum puteți observa, acuratețea inițială este de aproximativ 50%, dar crește rapid la valori mai mari, apropiindu-se de 90%.\n",
"După cum puteți vedea, acuratețea inițială este în jur de 50%, dar crește rapid la valori mai mari, apropiate de 90%.\n",
"\n",
"Să vizualizăm cum sunt separate clasele. Funcția noastră de clasificare arată astfel: $\\mathbf{w}^Tx$, și este mai mare decât 0 pentru o clasă, și mai mică decât 0 pentru cealaltă. Prin urmare, linia de separare a claselor este definită de $\\mathbf{w}^Tx = 0$. Deoarece avem doar două dimensiuni $x_0$ și $x_1$, ecuația liniei ar fi $w_0x_0+w_1x_1+w_2 = 0$ (amintiți-vă că am definit explicit o dimensiune suplimentară $x_2=1$). Să desenăm această linie:\n"
"Să vizualizăm cum sunt separate clasele. Funcția noastră de clasificare arată astfel: $\\mathbf{w}^Tx$, și este mai mare decât 0 pentru o clasă, iar mai mică decât 0 pentru cealaltă. Astfel, linia de separare a claselor este definită de $\\mathbf{w}^Tx = 0$. Deoarece avem doar două dimensiuni $x_0$ și $x_1$, ecuația liniei ar fi $w_0x_0+w_1x_1+w_2 = 0$ (amintiți-vă că am definit explicit o dimensiune suplimentară $x_2=1$). Să desenăm această linie:\n"
]
},
{
@ -379,7 +381,7 @@
"source": [
"## Evaluare pe Setul de Date de Test\n",
"\n",
"La început, am separat o parte din date pentru setul de date de test. Să vedem cât de precis este clasificatorul nostru pe acest set de date de test. Pentru a face acest lucru, extindem și setul de date de test cu o dimensiune suplimentară, îl înmulțim cu matricea de ponderi și ne asigurăm că valoarea obținută are același semn ca eticheta (+1 sau -1). Apoi, adunăm toate valorile booleene și împărțim la lungimea eșantionului de test pentru a obține acuratețea:\n"
"La început, am separat o parte din date pentru setul de test. Să vedem cât de precis este clasificatorul nostru pe acest set de test. Pentru a face acest lucru, extindem setul de test cu o dimensiune suplimentară, îl înmulțim cu matricea de greutăți și ne asigurăm că valoarea obținută are același semn ca eticheta (+1 sau -1). Apoi adunăm toate valorile booleene și împărțim la lungimea eșantionului de test pentru a obține acuratețea:\n"
]
},
{
@ -420,7 +422,7 @@
"source": [
"## Observarea procesului de antrenament\n",
"\n",
"Am văzut anterior cum acuratețea scade pe parcursul antrenamentului. Ar fi interesant să vedem cum se comportă linia de separare în timpul antrenamentului. Codul de mai jos va vizualiza totul pe un singur grafic, iar tu vei putea să muți cursorul pentru a \"călători în timp\" prin procesul de antrenament.\n"
"Am văzut anterior cum scade acuratețea în timpul antrenamentului. Ar fi interesant să observăm cum se comportă linia de separare pe parcursul antrenamentului. Codul de mai jos va vizualiza totul pe un singur grafic, iar tu ar trebui să poți muta cursorul pentru a \"călători în timp\" prin procesul de antrenament.\n"
]
},
{
@ -525,18 +527,18 @@
}
},
"source": [
"## Limitările perceptronului\n",
"## Limitări ale Perceptronului\n",
"\n",
"Așa cum ai văzut mai sus, perceptronul este un **clasificator liniar**. Poate distinge bine între două clase dacă acestea sunt **liniar separabile**, adică pot fi separate printr-o linie dreaptă. În caz contrar, procesul de antrenare al perceptronului nu va converge.\n",
"Așa cum ai văzut mai sus, perceptronul este un **clasificator liniar**. Acesta poate distinge bine între două clase dacă ele sunt **liniar separabile**, adică pot fi separate printr-o linie dreaptă. În caz contrar, procesul de antrenare al perceptronului nu va converge.\n",
"\n",
"Un exemplu evident al unei probleme care nu poate fi rezolvată de un perceptron este așa-numita **problemă XOR**. Ne dorim ca perceptronul nostru să învețe funcția booleană XOR, care are următorul tabel de adevăr:\n",
"Un exemplu evident de problemă care nu poate fi rezolvată de un perceptron este așa-numita **problemă XOR**. Dorim ca perceptronul nostru să învețe funcția booleană XOR, care are următorul tabel de adevăr:\n",
"\n",
"| | 0 | 1 |\n",
"|---|---|---|\n",
"| 0 | 0 | 1 | \n",
"| 1 | 1 | 0 |\n",
"\n",
"Hai să încercăm să facem asta! Vom popula manual toate exemplele pozitive și negative de antrenament, apoi vom apela funcția noastră de antrenare definită mai sus:\n"
"Hai să încercăm! Vom popula manual toate exemplele de antrenament pozitive și negative, apoi vom apela funcția noastră de antrenare definită mai sus:\n"
]
},
{
@ -603,21 +605,21 @@
}
},
"source": [
"Așa cum se poate observa din graficul de mai sus, acuratețea nu depășește niciodată 75%, deoarece este imposibil să tragi o linie dreaptă astfel încât să clasifici corect toate exemplele posibile.\n",
"Așa cum se poate observa din graficul de mai sus, acuratețea nu depășește niciodată 75%, deoarece este imposibil să se traseze o linie dreaptă astfel încât să se obțină toate exemplele corecte.\n",
"\n",
"Problema XOR este un exemplu clasic al limitărilor perceptronului, iar aceasta a fost evidențiată de Marvin Minsky și Seymour Papert în 1969, în cartea lor [Perceptrons](https://en.wikipedia.org/wiki/Perceptrons_(book)). Această observație a limitat cercetările în domeniul rețelelor neuronale timp de aproape 10 ani, deși - și vom vedea acest lucru în secțiunea următoare a cursului nostru - perceptronii cu mai multe straturi sunt perfect capabili să rezolve astfel de probleme.\n",
"Problema XOR este un exemplu clasic al limitărilor perceptronului, iar aceasta a fost subliniată de Marvin Minsky și Seymour Papert în 1969, în cartea lor [Perceptrons](https://en.wikipedia.org/wiki/Perceptrons_(book)). Această observație a limitat cercetările în domeniul rețelelor neuronale timp de aproape 10 ani, deși - și vom vedea acest lucru în secțiunea următoare a cursului nostru - perceptronii cu mai multe straturi sunt perfect capabili să rezolve astfel de probleme.\n",
"\n",
"## Exemplu Complex - MNIST\n",
"\n",
"Deși perceptronul nu poate rezolva problema XOR, acesta poate rezolva multe alte probleme mai complexe, cum ar fi recunoașterea caracterelor scrise de mână.\n",
"Deși perceptronul nu poate rezolva problema XOR, acesta poate rezolva multe probleme mult mai complexe, cum ar fi recunoașterea caracterelor scrise de mână.\n",
"\n",
"Un set de date utilizat frecvent pentru a învăța despre învățarea automată se numește [MNIST](https://en.wikipedia.org/wiki/MNIST_database). Acesta a fost creat de Institutul Național de Standarde și Tehnologie Modificat și conține un set de antrenament cu 60.000 de cifre scrise de mână, colectate de la aproximativ 250 de studenți și angajați ai institutului. Există, de asemenea, un set de testare cu 10.000 de cifre, colectate de la alte persoane.\n",
"Un set de date utilizat frecvent pentru a învăța machine learning se numește [MNIST](https://en.wikipedia.org/wiki/MNIST_database). Acesta a fost creat de Institutul Național de Standarde și Tehnologie Modificat și conține un set de antrenament cu 60.000 de cifre scrise de mână, colectate de la aproximativ 250 de studenți și angajați ai institutului. Există, de asemenea, un set de testare cu 10.000 de cifre, colectate de la persoane diferite.\n",
"\n",
"Toate cifrele sunt reprezentate prin imagini în tonuri de gri, de dimensiune 28x28 pixeli.\n",
"Toate cifrele sunt reprezentate prin imagini în tonuri de gri de dimensiunea 28x28 pixeli.\n",
"\n",
"> Setul de date MNIST este disponibil ca o competiție de antrenament pe [Kaggle](https://www.kaggle.com/c/digit-recognizer), un site care găzduiește competiții și concursuri de învățare automată. Odată ce înveți cum să clasifici cifrele din MNIST, poți trimite soluția ta pe Kaggle pentru a vedea cum este evaluată în comparație cu alți participanți.\n",
"> Setul de date MNIST este disponibil ca o competiție de antrenament pe [Kaggle](https://www.kaggle.com/c/digit-recognizer), un site care găzduiește competiții și concursuri de machine learning. După ce înveți cum să clasifici cifrele MNIST, poți trimite soluția ta pe Kaggle pentru a vedea cum este evaluată în comparație cu alți participanți.\n",
"\n",
"Începem prin a încărca setul de date MNIST:\n"
"Începem prin încărcarea setului de date MNIST:\n"
]
},
{
@ -642,7 +644,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Să reprezentăm acum grafic setul de date:\n"
"Să plotăm acum setul de date:\n"
]
},
{
@ -831,9 +833,9 @@
"source": [
"Vă rugăm să observați cum acuratețea crește aproape de 100% foarte rapid.\n",
"\n",
"Vă rugăm să mutați cursorul spre o poziție aproape de finalul antrenamentului și să observați matricea de greutăți afișată în stânga. Această matrice vă va permite să înțelegeți cum funcționează perceptronul. Puteți vedea valorile mari ale greutăților în mijlocul câmpului, care corespund pixelilor ce sunt de obicei prezenți pentru cifra 1, și valorile negative mici pe margini, unde se află părți ale cifrei 0. Astfel, dacă cifra prezentată perceptronului este de fapt 1, partea din mijloc va fi înmulțită cu valori mari, producând un rezultat pozitiv. În schimb, când perceptronul observă cifra 0, pixelii corespunzători vor fi înmulțiți cu numere negative.\n",
"Vă rugăm să mutați cursorul spre o poziție de la sfârșitul antrenamentului și să observați matricea de greutăți afișată în stânga. Această matrice vă va ajuta să înțelegeți cum funcționează perceptronul. Puteți vedea valorile mari ale greutăților în mijlocul câmpului, care corespund pixelilor ce sunt de obicei prezenți pentru cifra 1, și valorile negative mici pe margini, unde se află părți ale cifrei 0. Astfel, dacă cifra prezentată perceptronului este de fapt 1, partea din mijloc va fi înmulțită cu valori mari, producând un rezultat pozitiv. În schimb, când perceptronul observă cifra 0, pixelii corespunzători vor fi înmulțiți cu numere negative.\n",
"\n",
"> Este posibil să observați că, dacă oferim perceptronului o cifră 1 ușor deplasată orizontal, astfel încât pixelii să ocupe locul unde se află părțile verticale ale cifrei 0, putem obține un rezultat incorect. Deoarece natura dataset-ului nostru MNIST este astfel încât toate cifrele sunt centrate și poziționate corect, perceptronul se bazează pe acest lucru pentru a distinge între cifre.\n",
"> Puteți observa că, dacă oferim perceptronului o cifră 1 ușor deplasată orizontal, astfel încât pixelii să ocupe locul unde se află părțile verticale ale cifrei 0, putem obține un rezultat incorect. Deoarece natura setului nostru de date MNIST este astfel încât toate cifrele sunt centrate și poziționate corect, perceptronul se bazează pe acest lucru pentru a distinge între cifre.\n",
"\n",
"Acum să încercăm cifre diferite:\n"
]
@ -911,9 +913,9 @@
"source": [
"## Discuție\n",
"\n",
"Din anumite motive, 2 și 5 nu sunt atât de ușor de separabile. Deși obținem o acuratețe relativ ridicată (peste 85%), putem observa clar cum perceptronul încetează să mai învețe la un moment dat.\n",
"Dintr-un motiv oarecare, 2 și 5 nu sunt atât de ușor de separabile. Deși obținem o acuratețe relativ ridicată (peste 85%), putem observa clar cum perceptronul încetează să mai învețe la un moment dat.\n",
"\n",
"Pentru a înțelege de ce se întâmplă acest lucru, putem încerca să folosim [Analiza Componentelor Principale](https://en.wikipedia.org/wiki/Principal_component_analysis) (PCA). Este o tehnică de învățare automată utilizată pentru a reduce dimensiunea setului de date de intrare, astfel încât să obținem cea mai bună separabilitate între clase.\n",
"Pentru a înțelege de ce se întâmplă acest lucru, putem încerca să folosim [Analiza Componentelor Principale](https://en.wikipedia.org/wiki/Principal_component_analysis) (PCA). Este o tehnică de învățare automată utilizată pentru a reduce dimensionalitatea setului de date de intrare, astfel încât să obținem cea mai bună separabilitate între clase.\n",
"\n",
"În cazul nostru, o imagine de intrare are 784 de pixeli (caracteristici de intrare), iar noi dorim să folosim PCA pentru a reduce numărul de parametri la doar 2, astfel încât să îi putem reprezenta pe un grafic. Acești doi parametri ar fi o combinație liniară a caracteristicilor originale, iar această procedură poate fi privită ca o \"rotire\" a spațiului nostru original de 784 de dimensiuni și observarea proiecției sale în spațiul 2D, până obținem cea mai bună vizualizare care separă clasele.\n"
]
@ -1025,7 +1027,7 @@
}
},
"source": [
"Așa cum se poate observa, 0 și 1 pot fi clar separate printr-o linie dreaptă. Acest lucru indică faptul că, în spațiul original de 784 de dimensiuni, punctele corespunzătoare cifrelor sunt, de asemenea, liniar separabile. În cazul cifrelor 2 și 5, nu putem găsi o proiecție bună care să separe clar cifrele, și astfel există unele cazuri de clasificare greșită.\n",
"După cum puteți vedea, 0 și 1 pot fi clar separate printr-o linie dreaptă. Acest lucru indică faptul că, în spațiul original de 784 dimensiuni, punctele corespunzătoare cifrelor sunt, de asemenea, separabile liniar. În cazul cifrelor 2 și 5, nu putem găsi o proiecție bună care să separe clar cifrele, și astfel există unele cazuri de clasificare greșită.\n",
"\n",
"> Mai târziu, în acest curs, vom învăța cum să creăm clasificatori neliniari folosind Rețele Neuronale și cum să abordăm problema cifrelor care nu sunt aliniate corespunzător. Foarte curând vom atinge o acuratețe de peste 99% în clasificarea cifrelor MNIST, clasificându-le în 10 clase diferite.\n",
"\n",
@ -1034,8 +1036,8 @@
" * Am învățat despre cea mai simplă arhitectură de rețea neuronală - perceptronul cu un singur strat.\n",
" * Am implementat perceptronul „manual”, folosind o procedură simplă de antrenare bazată pe gradient descent.\n",
" * În ciuda simplității, perceptronul cu un singur strat poate rezolva probleme destul de complexe de recunoaștere a cifrelor scrise de mână.\n",
" * Perceptronul cu un singur strat este un clasificator liniar și, prin urmare, oferă aceeași putere de clasificare ca regresia logistică.\n",
" * În spațiul de eșantionare, perceptronul poate separa două clase de date de intrare folosind un hiperplan.\n"
" * Perceptronul cu un singur strat este un clasificator liniar și, astfel, oferă aceeași putere de clasificare ca regresia logistică.\n",
" * În spațiul de date, perceptronul poate separa două clase de date de intrare folosind un hiperplan.\n"
]
},
{
@ -1044,14 +1046,14 @@
"source": [
"## Credite\n",
"\n",
"Acest notebook face parte din [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners) și a fost pregătit de [Dmitry Soshnikov](http://soshnikov.com). Este inspirat de Workshop-ul despre Rețele Neuronale de la Microsoft Research Cambridge. O parte din cod și materialele ilustrative sunt preluate din prezentările realizate de [Katja Hoffmann](https://www.microsoft.com/en-us/research/people/kahofman/), [Matthew Johnson](https://www.microsoft.com/en-us/research/people/matjoh/) și [Ryoto Tomioka](https://www.microsoft.com/en-us/research/people/ryoto/), precum și din repository-ul [NeuroWorkshop](http://github.com/shwars/NeuroWorkshop).\n"
"Acest notebook face parte din [Curricula AI pentru Începători](http://github.com/microsoft/ai-for-beginners) și a fost pregătit de [Dmitry Soshnikov](http://soshnikov.com). Este inspirat de Workshop-ul despre Rețele Neurale de la Microsoft Research Cambridge. Unele coduri și materiale ilustrative sunt preluate din prezentările realizate de [Katja Hoffmann](https://www.microsoft.com/en-us/research/people/kahofman/), [Matthew Johnson](https://www.microsoft.com/en-us/research/people/matjoh/) și [Ryoto Tomioka](https://www.microsoft.com/en-us/research/people/ryoto/), precum și din repository-ul [NeuroWorkshop](http://github.com/shwars/NeuroWorkshop).\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Declinare de responsabilitate**: \nAcest document a fost tradus folosind serviciul de traducere AI [Co-op Translator](https://github.com/Azure/co-op-translator). Deși ne străduim să asigurăm acuratețea, vă rugăm să fiți conștienți că traducerile automate pot conține erori sau inexactități. Documentul original în limba sa natală ar trebui considerat sursa autoritară. Pentru informații critice, se recomandă traducerea profesională realizată de un specialist uman. Nu ne asumăm responsabilitatea pentru eventualele neînțelegeri sau interpretări greșite care pot apărea din utilizarea acestei traduceri.\n"
"\n---\n\n**Declinare de responsabilitate**: \nAcest document a fost tradus folosind serviciul de traducere AI [Co-op Translator](https://github.com/Azure/co-op-translator). Deși ne străduim să asigurăm acuratețea, vă rugăm să fiți conștienți că traducerile automate pot conține erori sau inexactități. Documentul original în limba sa maternă ar trebui considerat sursa autoritară. Pentru informații critice, se recomandă traducerea profesională realizată de un specialist uman. Nu ne asumăm responsabilitatea pentru eventualele neînțelegeri sau interpretări greșite care pot apărea din utilizarea acestei traduceri.\n"
]
}
],
@ -1080,8 +1082,8 @@
"start_slideshow_at": "selected"
},
"coopTranslator": {
"original_hash": "914fc55f59efc7e17b8130d4033ac617",
"translation_date": "2025-08-30T00:09:03+00:00",
"original_hash": "d67e5b54ba20b507aa88d71aa3d042d8",
"translation_date": "2025-10-03T13:43:02+00:00",
"source_file": "lessons/3-NeuralNetworks/03-Perceptron/Perceptron.ipynb",
"language_code": "ro"
}

View File

@ -13,7 +13,7 @@
"\n",
"> Этот ноутбук является частью [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners). Посетите репозиторий, чтобы получить полный набор учебных материалов.\n",
"\n",
"Как мы уже обсуждали, перцептрон позволяет решать задачу **бинарной классификации**, то есть классифицировать входные примеры на два класса - мы можем назвать их **положительный** и **отрицательный**.\n",
"Как мы уже обсуждали, перцептрон позволяет решать задачу **бинарной классификации**, то есть классифицировать входные примеры на два класса мы можем назвать их **положительный** и **отрицательный**.\n",
"\n",
"Сначала давайте импортируем некоторые необходимые библиотеки.\n"
]
@ -49,9 +49,9 @@
"source": [
"## Пример задачи\n",
"\n",
"Для начала давайте разберем простую задачу, где у нас есть два входных признака. Например, в медицине мы можем захотеть классифицировать опухоли как доброкачественные или злокачественные в зависимости от их размера и возраста.\n",
"Для начала рассмотрим простую задачу, где у нас есть два входных признака. Например, в медицине мы можем захотеть классифицировать опухоли как доброкачественные или злокачественные, в зависимости от их размера и возраста.\n",
"\n",
"Мы сгенерируем случайный набор данных для классификации, используя функцию `make_classification` из библиотеки SciKit Learn:\n"
"Мы создадим случайный набор данных для классификации, используя функцию `make_classification` из библиотеки SciKit Learn:\n"
]
},
{
@ -166,7 +166,7 @@
" \\end{cases} \\\\\n",
"$$\n",
"\n",
"Однако, общая линейная модель должна также включать смещение (bias), то есть, в идеале, мы должны вычислять $y$ как $y=f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}+\\mathbf{b})$. Чтобы упростить нашу модель, мы можем избавиться от этого смещения, добавив еще одно измерение к нашим входным признакам, которое всегда равно 1:\n"
"Однако, в общем случае линейная модель должна также иметь смещение (bias), то есть, в идеале, мы должны вычислять $y$ как $y=f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}+\\mathbf{b})$. Чтобы упростить нашу модель, мы можем избавиться от этого смещения, добавив еще одно измерение к нашим входным признакам, которое всегда равно 1:\n"
]
},
{
@ -206,7 +206,7 @@
"source": [
"## Алгоритм обучения\n",
"\n",
"Для обучения перцептрона необходимо найти веса $\\mathbf{w}$, которые минимизируют ошибку. Ошибка определяется с помощью **критерия перцептрона**:\n",
"Чтобы обучить перцептрон, необходимо найти веса $\\mathbf{w}$, которые минимизируют ошибку. Ошибка определяется с помощью **критерия перцептрона**:\n",
"\n",
"$$E(\\mathbf{w}) = -\\sum_{n \\in \\mathcal{M}}\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}_{n}t_{n}$$\n",
" \n",
@ -217,7 +217,7 @@
"\n",
"$$\\mathbf{w}^{\\tau + 1}=\\mathbf{w}^{\\tau} - \\eta \\nabla E(\\mathbf{w}) = \\mathbf{w}^{\\tau} + \\eta\\sum_{n \\in \\mathcal{M}}\\mathbf{x}_{n} t_{n}$$\n",
"\n",
"где $\\eta$ - **скорость обучения**, а $\\tau\\in\\mathbb{N}$ - номер итерации.\n",
"где $\\eta$ — **скорость обучения**, а $\\tau\\in\\mathbb{N}$ — номер итерации.\n",
"\n",
"Определим этот алгоритм на Python:\n"
]
@ -271,7 +271,9 @@
{
"cell_type": "markdown",
"metadata": {},
"source": []
"source": [
"Теперь давайте запустим обучение на нашем наборе данных:\n"
]
},
{
"cell_type": "code",
@ -311,7 +313,7 @@
"source": [
"Как видно, начальная точность составляет около 50%, но она быстро увеличивается до более высоких значений, близких к 90%.\n",
"\n",
"Давайте визуализируем, как разделяются классы. Наша функция классификации выглядит как $\\mathbf{w}^Tx$, и она больше 0 для одного класса и меньше 0 для другого. Таким образом, линия разделения классов определяется уравнением $\\mathbf{w}^Tx = 0$. Поскольку у нас только две переменные $x_0$ и $x_1$, уравнение линии будет $w_0x_0+w_1x_1+w_2 = 0$ (помните, что мы явно добавили дополнительное измерение $x_2=1$). Давайте построим эту линию:\n"
"Давайте визуализируем, как классы разделяются. Наша функция классификации выглядит как $\\mathbf{w}^Tx$, и она больше 0 для одного класса, а меньше 0 для другого. Таким образом, линия разделения классов определяется уравнением $\\mathbf{w}^Tx = 0$. Поскольку у нас есть только две размерности $x_0$ и $x_1$, уравнение для линии будет $w_0x_0+w_1x_1+w_2 = 0$ (помните, что мы явно определили дополнительную размерность $x_2=1$). Давайте построим эту линию:\n"
]
},
{
@ -379,7 +381,7 @@
"source": [
"## Оценка на тестовом наборе данных\n",
"\n",
"С самого начала мы выделили часть данных для тестового набора. Давайте проверим, насколько точен наш классификатор на этом тестовом наборе. Для этого мы также расширяем тестовый набор, добавляя дополнительное измерение, умножаем на матрицу весов и убеждаемся, что полученное значение имеет тот же знак, что и метка (+1 или -1). Затем мы суммируем все булевы значения и делим на длину тестовой выборки, чтобы получить точность:\n"
"В начале мы выделили часть данных для тестового набора. Давайте проверим, насколько точен наш классификатор на этом тестовом наборе данных. Для этого мы также расширяем тестовый набор данных, добавляя дополнительное измерение, умножаем на матрицу весов и убеждаемся, что полученное значение имеет тот же знак, что и метка (+1 или -1). Затем мы суммируем все булевы значения и делим на длину тестовой выборки, чтобы получить точность:\n"
]
},
{
@ -527,16 +529,16 @@
"source": [
"## Ограничения перцептрона\n",
"\n",
"Как вы уже видели, перцептрон является **линейным классификатором**. Он хорошо справляется с разделением двух классов, если они **линейно разделимы**, то есть их можно разделить прямой линией. В противном случае процесс обучения перцептрона не будет сходиться.\n",
"Как вы уже видели, перцептрон является **линейным классификатором**. Он хорошо различает два класса, если они **линейно разделимы**, то есть могут быть разделены прямой линией. В противном случае процесс обучения перцептрона не будет сходиться.\n",
"\n",
"Самый очевидный пример задачи, которую перцептрон не может решить, — это так называемая **задача XOR**. Мы хотим, чтобы наш перцептрон научился булевой функции XOR, которая имеет следующую таблицу истинности:\n",
"Самый очевидный пример задачи, которую невозможно решить с помощью перцептрона, — это так называемая **задача XOR**. Мы хотим, чтобы наш перцептрон научился булевой функции XOR, которая имеет следующую таблицу истинности:\n",
"\n",
"| | 0 | 1 |\n",
"|---|---|---|\n",
"| 0 | 0 | 1 | \n",
"| 1 | 1 | 0 |\n",
"\n",
"Давайте попробуем это сделать! Мы вручную заполним все положительные и отрицательные обучающие примеры, а затем вызовем нашу функцию обучения, определённую выше:\n"
"Давайте попробуем это сделать! Мы вручную заполним все положительные и отрицательные обучающие примеры, а затем вызовем нашу функцию train, определённую выше:\n"
]
},
{
@ -603,21 +605,21 @@
}
},
"source": [
"Как видно из графика выше, точность никогда не превышает 75%, потому что невозможно провести прямую линию так, чтобы она правильно классифицировала все возможные примеры.\n",
"Как видно из графика выше, точность никогда не превышает 75%, потому что невозможно провести прямую линию так, чтобы правильно классифицировать все возможные примеры.\n",
"\n",
"Проблема XOR является классическим примером ограничений перцептрона, и на нее обратили внимание Марвин Мински и Сеймур Пейперт в 1969 году в своей книге [Perceptrons](https://en.wikipedia.org/wiki/Perceptrons_(book)). Это наблюдение затормозило исследования в области нейронных сетей почти на 10 лет, хотя - как мы увидим в следующем разделе нашего курса - многослойные перцептроны вполне способны решать такие задачи.\n",
"Задача XOR является классическим примером ограничений перцептрона, и на нее обратили внимание Марвин Мински и Сеймур Паперт в 1969 году в своей книге [Perceptrons](https://en.wikipedia.org/wiki/Perceptrons_(book)). Это наблюдение ограничило исследования в области нейронных сетей почти на 10 лет, хотя - и мы увидим это в следующем разделе нашего курса - многослойные перцептроны вполне способны решать такие задачи.\n",
"\n",
"## Сложный пример - MNIST\n",
"\n",
"Хотя перцептрон не может решить проблему XOR, он может справляться с гораздо более сложными задачами, такими как распознавание рукописных символов.\n",
"Несмотря на то, что перцептрон не может решить задачу XOR, он способен решать гораздо более сложные задачи, такие как распознавание рукописных символов.\n",
"\n",
"Набор данных, который часто используется при изучении машинного обучения, называется [MNIST](https://en.wikipedia.org/wiki/MNIST_database). Он был создан Модифицированным Национальным институтом стандартов и технологий и содержит обучающую выборку из 60000 рукописных цифр, собранных примерно у 250 студентов и сотрудников института. Также имеется тестовый набор данных из 10000 цифр, собранных у других людей.\n",
"Датасет, который часто используется для изучения машинного обучения, называется [MNIST](https://en.wikipedia.org/wiki/MNIST_database). Он был создан Модифицированным Национальным институтом стандартов и технологий и содержит обучающую выборку из 60 000 рукописных цифр, собранных примерно у 250 студентов и сотрудников института. Также имеется тестовый набор данных из 10 000 цифр, собранных у других людей.\n",
"\n",
"Все цифры представлены в виде черно-белых изображений размером 28x28 пикселей.\n",
"Все цифры представлены в виде изображений в градациях серого размером 28x28 пикселей.\n",
"\n",
"> Набор данных MNIST доступен в качестве тренировочного соревнования на [Kaggle](https://www.kaggle.com/c/digit-recognizer), сайте, который проводит конкурсы и соревнования по машинному обучению. Как только вы научитесь классифицировать цифры из MNIST, вы можете отправить свое решение на Kaggle, чтобы узнать, как оно оценивается среди других участников.\n",
"> Датасет MNIST доступен в виде тренировочного соревнования на [Kaggle](https://www.kaggle.com/c/digit-recognizer), сайте, который проводит конкурсы и соревнования по машинному обучению. Как только вы научитесь классифицировать цифры MNIST, вы можете отправить свое решение на Kaggle, чтобы узнать, как оно оценивается среди других участников.\n",
"\n",
"Мы начнем с загрузки набора данных MNIST:\n"
"Начнем с загрузки датасета MNIST:\n"
]
},
{
@ -732,7 +734,9 @@
{
"cell_type": "markdown",
"metadata": {},
"source": []
"source": [
"Мы начнем с попытки классифицировать между 0 и 1:\n"
]
},
{
"cell_type": "code",
@ -829,11 +833,11 @@
"source": [
"Обратите внимание, как точность очень быстро достигает почти 100%.\n",
"\n",
"Пожалуйста, переместите ползунок ближе к концу обучения и обратите внимание на матрицу весов, отображённую слева. Эта матрица поможет вам понять, как работает перцептрон. Вы можете увидеть высокие значения весов в середине поля, которые соответствуют пикселям, обычно присутствующим для цифры 1, и низкие отрицательные значения по краям, где находятся части цифры 0. Таким образом, если цифра, поданная на вход перцептрону, действительно является 1, её центральная часть будет умножена на высокие значения, что даст положительный результат. Напротив, когда перцептрон видит цифру 0, соответствующие пиксели умножаются на отрицательные числа.\n",
"Пожалуйста, переместите ползунок ближе к концу обучения и посмотрите на матрицу весов, отображаемую слева. Эта матрица поможет вам понять, как работает перцептрон. Вы можете увидеть высокие значения весов в центре поля, которые соответствуют пикселям, обычно присутствующим для цифры 1, и низкие отрицательные значения по краям, где находятся части цифры 0. Таким образом, если цифра, представленная перцептрону, действительно является 1, центральная часть будет умножена на высокие значения, что даст положительный результат. Напротив, когда перцептрон видит цифру 0, соответствующие пиксели умножаются на отрицательные числа.\n",
"\n",
"> Вы можете заметить, что если мы подадим перцептрону цифру 1, слегка сдвинутую по горизонтали, так что её пиксели займут место, где находятся вертикальные части цифры 0, мы можем получить некорректный результат. Это связано с тем, что природа нашего набора данных MNIST такова, что все цифры центрированы и правильно расположены, и перцептрон полагается на это для различения цифр.\n",
"> Вы можете заметить, что если мы дадим нашему перцептрону цифру 1, слегка сдвинутую по горизонтали, так что её пиксели займут место, где находятся вертикальные части цифры 0, мы можем получить некорректный результат. Это связано с тем, что природа нашего набора данных MNIST такова, что все цифры центрированы и правильно расположены, а перцептрон полагается на это для различения цифр.\n",
"\n",
"Теперь давайте попробуем другие цифры:\n"
"Теперь давайте попробуем разные цифры:\n"
]
},
{
@ -909,11 +913,11 @@
"source": [
"## Обсуждение\n",
"\n",
"По какой-то причине цифры 2 и 5 не так легко разделить. Несмотря на то, что мы достигаем относительно высокой точности (выше 85%), можно заметить, что в какой-то момент перцептрон перестает обучаться.\n",
"По какой-то причине цифры 2 и 5 не так легко разделить. Несмотря на то, что мы достигаем довольно высокой точности (выше 85%), можно заметить, что в какой-то момент персептрон перестает обучаться.\n",
"\n",
"Чтобы понять, почему это происходит, мы можем попробовать использовать [Анализ главных компонент](https://en.wikipedia.org/wiki/Principal_component_analysis) (PCA). Это метод машинного обучения, который используется для снижения размерности входного набора данных таким образом, чтобы обеспечить наилучшее разделение между классами.\n",
"\n",
"В нашем случае входное изображение имеет 784 пикселя (входных признака), и мы хотим использовать PCA, чтобы уменьшить количество параметров до всего лишь 2, чтобы можно было построить их график. Эти два параметра будут линейной комбинацией исходных признаков, и этот процесс можно представить как \"поворот\" нашего исходного 784-мерного пространства и наблюдение его проекции на 2D-пространство, пока мы не получим наилучший вид, который разделяет классы.\n"
"В нашем случае входное изображение содержит 784 пикселя (входных признака), и мы хотим использовать PCA, чтобы уменьшить количество параметров до всего лишь 2, чтобы можно было их отобразить на графике. Эти два параметра будут линейной комбинацией исходных признаков, и этот процесс можно представить как \"поворот\" нашего исходного 784-мерного пространства и наблюдение его проекции на 2D-пространство, пока мы не получим наилучший вид, который разделяет классы.\n"
]
},
{
@ -1023,16 +1027,16 @@
}
},
"source": [
"Как вы видите, 0 и 1 можно четко разделить прямой линией. Это указывает на то, что в исходном 784-мерном пространстве точки, соответствующие цифрам, также линейно разделимы. В случае с 2 и 5 мы не можем найти хорошую проекцию, которая четко разделит цифры, и поэтому возникают случаи неправильной классификации.\n",
"Как видно, 0 и 1 можно четко разделить прямой линией. Это указывает на то, что в исходном 784-мерном пространстве точки, соответствующие цифрам, также линейно разделимы. В случае с 2 и 5 мы не можем найти подходящую проекцию, которая бы четко разделила цифры, и поэтому возникают случаи неправильной классификации.\n",
"\n",
"> Позже в этом курсе мы научимся создавать нелинейные классификаторы с использованием нейронных сетей и решать проблему неправильного выравнивания цифр. Очень скоро мы достигнем точности выше 99% в классификации цифр MNIST, разделяя их на 10 различных классов.\n",
"\n",
"## Основные выводы\n",
"\n",
" * Мы узнали о самой простой архитектуре нейронной сети — однослойном перцептроне.\n",
" * Мы изучили самую простую архитектуру нейронной сети — однослойный перцептрон.\n",
" * Мы реализовали перцептрон \"вручную\", используя простую процедуру обучения на основе градиентного спуска.\n",
" * Несмотря на простоту, однослойный перцептрон способен решать довольно сложные задачи распознавания рукописных цифр.\n",
" * Однослойный перцептрон является линейным классификатором, и, таким образом, обладает той же классификационной мощностью, что и логистическая регрессия.\n",
" * Однослойный перцептрон является линейным классификатором, и, следовательно, обладает той же классификационной мощностью, что и логистическая регрессия.\n",
" * В пространстве выборки перцептрон может разделять два класса входных данных с помощью гиперплоскости.\n"
]
},
@ -1042,14 +1046,14 @@
"source": [
"## Благодарности\n",
"\n",
"Этот ноутбук является частью [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners) и был подготовлен [Дмитрием Сошниковым](http://soshnikov.com). Он вдохновлен мастерской по нейронным сетям в Microsoft Research Cambridge. Часть кода и иллюстративных материалов взята из презентаций [Катьи Хоффман](https://www.microsoft.com/en-us/research/people/kahofman/), [Мэттью Джонсона](https://www.microsoft.com/en-us/research/people/matjoh/) и [Рёто Томиоки](https://www.microsoft.com/en-us/research/people/ryoto/), а также из репозитория [NeuroWorkshop](http://github.com/shwars/NeuroWorkshop).\n"
"Этот ноутбук является частью [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners) и был подготовлен [Дмитрием Сошниковым](http://soshnikov.com). Он вдохновлен семинаром по нейронным сетям в Microsoft Research Cambridge. Некоторый код и иллюстративные материалы взяты из презентаций [Катьи Хоффман](https://www.microsoft.com/en-us/research/people/kahofman/), [Мэттью Джонсона](https://www.microsoft.com/en-us/research/people/matjoh/) и [Рёто Томиоки](https://www.microsoft.com/en-us/research/people/ryoto/), а также из репозитория [NeuroWorkshop](http://github.com/shwars/NeuroWorkshop).\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Отказ от ответственности**: \nЭтот документ был переведен с использованием сервиса автоматического перевода [Co-op Translator](https://github.com/Azure/co-op-translator). Несмотря на наши усилия обеспечить точность, автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на его исходном языке следует считать авторитетным источником. Для получения критически важной информации рекомендуется профессиональный перевод человеком. Мы не несем ответственности за любые недоразумения или неправильные интерпретации, возникшие в результате использования данного перевода.\n"
"\n---\n\n**Отказ от ответственности**: \nЭтот документ был переведен с помощью сервиса автоматического перевода [Co-op Translator](https://github.com/Azure/co-op-translator). Несмотря на наши усилия обеспечить точность, автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на его родном языке следует считать авторитетным источником. Для получения критически важной информации рекомендуется профессиональный перевод человеком. Мы не несем ответственности за любые недоразумения или неправильные интерпретации, возникшие в результате использования данного перевода.\n"
]
}
],
@ -1078,8 +1082,8 @@
"start_slideshow_at": "selected"
},
"coopTranslator": {
"original_hash": "914fc55f59efc7e17b8130d4033ac617",
"translation_date": "2025-08-29T07:00:47+00:00",
"original_hash": "d67e5b54ba20b507aa88d71aa3d042d8",
"translation_date": "2025-10-03T13:06:53+00:00",
"source_file": "lessons/3-NeuralNetworks/03-Perceptron/Perceptron.ipynb",
"language_code": "ru"
}

View File

@ -11,9 +11,9 @@
"source": [
"## Perceptron\n",
"\n",
"> Tento notebook je súčasťou [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners). Navštívte repozitár pre kompletnú sadu vzdelávacích materiálov.\n",
"> Tento notebook je súčasťou [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners). Navštívte repozitár pre kompletnú sadu učebných materiálov.\n",
"\n",
"Ako sme už diskutovali, perceptron vám umožňuje riešiť **problém binárnej klasifikácie**, t. j. klasifikovať vstupné príklady do dvoch tried - môžeme ich nazvať **pozitívne** a **negatívne**.\n",
"Ako sme už diskutovali, perceptron vám umožňuje riešiť **problém binárnej klasifikácie**, teda klasifikovať vstupné príklady do dvoch tried - môžeme ich nazvať **pozitívne** a **negatívne**.\n",
"\n",
"Najprv si importujme niektoré potrebné knižnice.\n"
]
@ -47,9 +47,9 @@
}
},
"source": [
"## Ukážkový problém\n",
"## Hračkový problém\n",
"\n",
"Začnime jednoduchým problémom, kde máme dve vstupné vlastnosti. Napríklad v medicíne môžeme chcieť klasifikovať nádory na nezhubné a zhubné, v závislosti od ich veľkosti a veku.\n",
"Začnime jednoduchým problémom, kde máme dva vstupné atribúty. Napríklad v medicíne môžeme chcieť klasifikovať nádory na benígne a malígne, v závislosti od ich veľkosti a veku.\n",
"\n",
"Vygenerujeme náhodný klasifikačný dataset pomocou funkcie `make_classification` z knižnice SciKit Learn:\n"
]
@ -158,7 +158,7 @@
"\n",
"$$y(\\mathbf{x}) = f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x})$$\n",
"\n",
"kde $\\mathbf{w}$ je vektor váh, $f$ je aktivačná funkcia typu krok:\n",
"kde $\\mathbf{w}$ je vektor váh, $f$ je aktivačná funkcia typu prahová funkcia:\n",
"$$\n",
"f(x) = \\begin{cases}\n",
" +1 & x \\geq 0 \\\\\n",
@ -166,7 +166,7 @@
" \\end{cases} \\\\\n",
"$$\n",
"\n",
"Avšak všeobecný lineárny model by mal mať aj bias, t.j. ideálne by sme mali počítať $y$ ako $y=f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}+\\mathbf{b})$. Na zjednodušenie nášho modelu sa môžeme zbaviť tohto biasu pridaním jednej ďalšej dimenzie k našim vstupným vlastnostiam, ktorá bude vždy rovná 1:\n"
"Avšak všeobecný lineárny model by mal mať aj bias, t.j. ideálne by sme mali vypočítať $y$ ako $y=f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}+\\mathbf{b})$. Na zjednodušenie nášho modelu sa môžeme zbaviť tohto biasu pridaním jednej ďalšej dimenzie k našim vstupným prvkom, ktorá bude vždy rovná 1:\n"
]
},
{
@ -206,18 +206,18 @@
"source": [
"## Tréningový algoritmus\n",
"\n",
"Aby sme mohli trénovať perceptron, musíme nájsť váhy $\\mathbf{w}$, ktoré minimalizujú chybu. Chyba je definovaná pomocou **perceptronového kritéria**:\n",
"Na natrénovanie perceptronu potrebujeme nájsť váhy $\\mathbf{w}$, ktoré minimalizujú chybu. Chyba je definovaná pomocou **kritéria perceptronu**:\n",
"\n",
"$$E(\\mathbf{w}) = -\\sum_{n \\in \\mathcal{M}}\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}_{n}t_{n}$$\n",
" \n",
" * $t_{n} \\in \\{-1, +1\\}$ pre negatívne a pozitívne trénovacie vzorky\n",
" * $t_{n} \\in \\{-1, +1\\}$ pre negatívne a pozitívne tréningové vzorky\n",
" * $\\mathcal{M}$ - množina nesprávne klasifikovaných príkladov\n",
" \n",
"Použijeme proces **gradientného zostupu**. Začneme s počiatočnými náhodnými váhami $\\mathbf{w}^{(0)}$ a na každom kroku tréningu budeme upravovať váhy pomocou gradientu $E$:\n",
"Použijeme proces **gradientného zostupu**. Začneme s náhodnými počiatočnými váhami $\\mathbf{w}^{(0)}$ a na každom kroku tréningu upravíme váhy pomocou gradientu $E$:\n",
"\n",
"$$\\mathbf{w}^{\\tau + 1}=\\mathbf{w}^{\\tau} - \\eta \\nabla E(\\mathbf{w}) = \\mathbf{w}^{\\tau} + \\eta\\sum_{n \\in \\mathcal{M}}\\mathbf{x}_{n} t_{n}$$\n",
"\n",
"kde $\\eta$ je **rýchlosť učenia** a $\\tau\\in\\mathbb{N}$ - počet iterácií.\n",
"kde $\\eta$ je **rýchlosť učenia**, a $\\tau\\in\\mathbb{N}$ - počet iterácií.\n",
"\n",
"Definujme tento algoritmus v Pythone:\n"
]
@ -271,7 +271,9 @@
{
"cell_type": "markdown",
"metadata": {},
"source": []
"source": [
"Teraz spustime tréning na našej dátovej sade:\n"
]
},
{
"cell_type": "code",
@ -309,9 +311,9 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Ako môžete vidieť, počiatočná presnosť je okolo 50 %, ale rýchlo sa zvyšuje na vyššie hodnoty blízke 90 %.\n",
"Ako vidíte, počiatočná presnosť je okolo 50 %, ale rýchlo sa zvyšuje na vyššie hodnoty blízke 90 %.\n",
"\n",
"Poďme si vizualizovať, ako sú triedy oddelené. Naša klasifikačná funkcia vyzerá ako $\\mathbf{w}^Tx$, a je väčšia ako 0 pre jednu triedu a menšia ako 0 pre druhú. Teda, deliaca čiara medzi triedami je definovaná ako $\\mathbf{w}^Tx = 0$. Keďže máme iba dve dimenzie $x_0$ a $x_1$, rovnica pre čiaru by bola $w_0x_0+w_1x_1+w_2 = 0$ (nezabudnite, že sme explicitne definovali extra dimenziu $x_2=1$). Poďme túto čiaru vykresliť:\n"
"Vizualizujme, ako sú triedy oddelené. Naša klasifikačná funkcia vyzerá ako $\\mathbf{w}^Tx$, a je väčšia ako 0 pre jednu triedu a menšia ako 0 pre druhú. Teda, deliaca čiara medzi triedami je definovaná ako $\\mathbf{w}^Tx = 0$. Keďže máme iba dve rozmery $x_0$ a $x_1$, rovnica pre čiaru by bola $w_0x_0+w_1x_1+w_2 = 0$ (pamätajte, že sme explicitne definovali extra rozmer $x_2=1$). Poďme túto čiaru vykresliť:\n"
]
},
{
@ -379,7 +381,7 @@
"source": [
"## Vyhodnotenie na testovacej množine\n",
"\n",
"Na začiatku sme odložili časť údajov do testovacej množiny. Pozrime sa, aká presná je naša klasifikácia na tejto testovacej množine. Aby sme to dosiahli, rozšírime testovaciu množinu o ďalší rozmer, vynásobíme maticou váh a uistíme sa, že získaná hodnota má rovnaké znamienko ako štítok (+1 alebo -1). Následne spočítame všetky hodnoty typu boolean a vydelíme ich dĺžkou testovacej vzorky, aby sme získali presnosť:\n"
"Na začiatku sme odložili časť údajov do testovacej množiny. Pozrime sa, aká presná je naša klasifikácia na tejto testovacej množine. Aby sme to dosiahli, rozšírime testovaciu množinu o ďalší rozmer, vynásobíme maticou váh a uistíme sa, že získaná hodnota má rovnaké znamienko ako štítok (+1 alebo -1). Následne spočítame všetky logické hodnoty a vydelíme ich dĺžkou testovacej vzorky, aby sme získali presnosť:\n"
]
},
{
@ -420,7 +422,7 @@
"source": [
"## Pozorovanie procesu tréningu\n",
"\n",
"Už sme videli, ako sa presnosť znižuje počas tréningu. Bolo by zaujímavé vidieť, ako sa správa deliaca čiara počas tréningu. Kód nižšie zobrazí všetko na jednom grafe, a mali by ste byť schopní posúvať posuvník, aby ste \"cestovali v čase\" cez proces tréningu.\n"
"Už sme videli, ako sa presnosť znižuje počas tréningu. Bolo by zaujímavé vidieť, ako sa správa deliaca čiara počas tréningu. Kód nižšie zobrazí všetko na jednom grafe, a budete môcť posúvať posuvník, aby ste \"cestovali v čase\" cez proces tréningu.\n"
]
},
{
@ -527,16 +529,16 @@
"source": [
"## Obmedzenia perceptronu\n",
"\n",
"Ako ste videli vyššie, perceptron je **lineárny klasifikátor**. Dokáže dobre rozlíšiť medzi dvoma triedami, ak sú **lineárne oddeliteľné**, t.j. ak ich možno oddeliť priamkou. V opačnom prípade proces učenia perceptronu nebude konvergovať.\n",
"Ako ste videli vyššie, perceptron je **lineárny klasifikátor**. Dokáže dobre rozlíšiť medzi dvoma triedami, ak sú **lineárne oddeliteľné**, t. j. ak ich možno oddeliť priamkou. V opačnom prípade proces trénovania perceptronu nebude konvergovať.\n",
"\n",
"Najzrejmejším príkladom problému, ktorý perceptron nedokáže vyriešiť, je tzv. **XOR problém**. Chceme, aby sa náš perceptron naučil booleovskú funkciu XOR, ktorá má nasledujúcu pravdivostnú tabuľku:\n",
"Najzjavnejším príkladom problému, ktorý perceptron nedokáže vyriešiť, je tzv. **XOR problém**. Chceme, aby sa náš perceptron naučil logickú funkciu XOR, ktorá má nasledujúcu pravdivostnú tabuľku:\n",
"\n",
"| | 0 | 1 |\n",
"|---|---|---|\n",
"| 0 | 0 | 1 | \n",
"| 1 | 1 | 0 |\n",
"\n",
"Poďme to skúsiť! Ručne vyplníme všetky pozitívne a negatívne trénovacie vzorky a potom zavoláme našu funkciu train definovanú vyššie:\n"
"Skúsme to! Ručne naplníme všetky pozitívne a negatívne trénovacie vzorky a potom zavoláme našu funkciu train definovanú vyššie:\n"
]
},
{
@ -605,17 +607,17 @@
"source": [
"Ako môžete vidieť z grafu vyššie, presnosť nikdy nepresiahne 75 %, pretože nie je možné nakresliť priamku tak, aby správne pokryla všetky možné príklady.\n",
"\n",
"Problém XOR je klasickým príkladom obmedzení perceptronu, na ktorý upozornili Marvin Minsky a Seymour Papert v roku 1969 vo svojej knihe [Perceptrons](https://en.wikipedia.org/wiki/Perceptrons_(book)). Toto zistenie obmedzilo výskum v oblasti neurónových sietí takmer na 10 rokov, aj keď - ako uvidíme v ďalšej časti nášho kurzu - viacvrstvové perceptrony dokážu takéto problémy bez problémov vyriešiť.\n",
"Problém XOR je klasickým príkladom obmedzení perceptrónu, na ktorý upozornili Marvin Minsky a Seymour Papert v roku 1969 vo svojej knihe [Perceptrons](https://en.wikipedia.org/wiki/Perceptrons_(book)). Toto zistenie obmedzilo výskum v oblasti neurónových sietí takmer na 10 rokov, aj keď - a to uvidíme v ďalšej časti nášho kurzu - viacvrstvové perceptróny sú schopné takéto problémy vyriešiť.\n",
"\n",
"## Komplexný príklad - MNIST\n",
"\n",
"Aj keď perceptron nedokáže vyriešiť problém XOR, dokáže riešiť oveľa zložitejšie problémy, ako je rozpoznávanie ručne písaných znakov.\n",
"Aj keď perceptrón nedokáže vyriešiť problém XOR, dokáže riešiť oveľa zložitejšie problémy, ako je rozpoznávanie rukou písaných znakov.\n",
"\n",
"Dataset, ktorý sa často používa pri osvojovaní strojového učenia, sa nazýva [MNIST](https://en.wikipedia.org/wiki/MNIST_database). Bol vytvorený Modifikovaným národným inštitútom pre normy a technológie a obsahuje tréningovú množinu 60 000 ručne písaných číslic, zozbieraných od približne 250 študentov a zamestnancov inštitútu. Existuje tiež testovacia množina 10 000 číslic, zozbieraných od rôznych jednotlivcov.\n",
"Dataset, ktorý sa často používa pri zvládnutí strojového učenia, sa nazýva [MNIST](https://en.wikipedia.org/wiki/MNIST_database). Bol vytvorený Modifikovaným národným inštitútom pre štandardy a technológie a obsahuje tréningovú množinu 60 000 rukou písaných číslic, zozbieraných od približne 250 študentov a zamestnancov inštitútu. Existuje aj testovacia množina s 10 000 číslicami, zozbieranými od rôznych jednotlivcov.\n",
"\n",
"Všetky číslice sú reprezentované obrázkami v odtieňoch sivej s rozmermi 28x28 pixelov.\n",
"\n",
"> Dataset MNIST je dostupný ako tréningová súťaž na [Kaggle](https://www.kaggle.com/c/digit-recognizer), stránke, ktorá hostí súťaže a výzvy v oblasti strojového učenia. Keď sa naučíte klasifikovať číslice MNIST, môžete svoje riešenie odoslať na Kaggle a zistiť, ako je hodnotené medzi ostatnými účastníkmi.\n",
"> Dataset MNIST je dostupný ako tréningová súťaž na stránke [Kaggle](https://www.kaggle.com/c/digit-recognizer), ktorá hostí súťaže a výzvy v oblasti strojového učenia. Keď sa naučíte klasifikovať číslice z MNIST, môžete svoj výsledok odoslať na Kaggle a zistiť, ako je hodnotený medzi ostatnými účastníkmi.\n",
"\n",
"Začíname načítaním datasetu MNIST:\n"
]
@ -693,7 +695,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Pretože perceptron je binárny klasifikátor, obmedzíme náš problém na rozpoznávanie iba dvoch číslic. Funkcia nižšie naplní pole pozitívnych a negatívnych vzoriek dvoma zadanými číslicami (a tiež zobrazí vzorky týchto číslic pre prehľadnosť).\n"
"Pretože perceptron je binárny klasifikátor, obmedzíme náš problém na rozpoznávanie iba dvoch číslic. Funkcia nižšie naplní pole pozitívnych a negatívnych vzoriek dvoma danými číslicami (a tiež zobrazí vzorky týchto číslic pre prehľadnosť).\n"
]
},
{
@ -829,13 +831,13 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Upozorňujeme, ako presnosť veľmi rýchlo stúpa takmer na 100 %.\n",
"Všimnite si, ako presnosť veľmi rýchlo stúpa takmer na 100 %.\n",
"\n",
"Prosím, posuňte posuvník na nejakú pozíciu smerom ku koncu tréningu a pozorujte maticu váh zobrazenú naľavo. Táto matica vám umožní pochopiť, ako perceptron vlastne funguje. Môžete vidieť vysoké hodnoty váh v strede poľa, ktoré zodpovedajú pixelom typicky prítomným pre číslicu 1, a nízke záporné hodnoty po stranách, kde sa nachádzajú časti číslice 0. Takže, ak je číslica prezentovaná perceptronu skutočne 1, jej stredná časť sa vynásobí vysokými hodnotami, čo vyprodukuje kladný výsledok. Naopak, keď perceptron pozoruje číslicu 0, zodpovedajúce pixely sa vynásobia zápornými číslami.\n",
"Prosím, posuňte posuvník na nejakú pozíciu ku koncu tréningu a pozorujte maticu váh zobrazenú naľavo. Táto matica vám umožní pochopiť, ako perceptron vlastne funguje. Môžete vidieť vysoké hodnoty váh v strede poľa, ktoré zodpovedajú pixelom, ktoré sú typicky prítomné pri čísle 1, a nízke negatívne hodnoty po stranách, kde sa nachádzajú časti čísla 0. Takže, ak je číslo prezentované perceptronu skutočne 1, jeho stredná časť bude násobená vysokými hodnotami, čo vyprodukuje pozitívny výsledok. Naopak, keď perceptron pozoruje číslo 0, príslušné pixely budú násobené negatívnymi číslami.\n",
"\n",
"> Môžete si všimnúť, že ak dáme nášmu perceptronu číslicu 1 mierne posunutú horizontálne, takže jej pixely zaberajú miesto, kde sú vertikálne časti číslice 0, môžeme dostať nesprávny výsledok. Keďže povaha nášho datasetu MNIST je taká, že všetky číslice sú centrované a správne umiestnené, perceptron sa na to spolieha pri rozlišovaní medzi číslicami.\n",
"> Môžete si všimnúť, že ak dáme nášmu perceptronu číslo 1 mierne posunuté horizontálne, takže jeho pixely zaberajú miesto, kde sú vertikálne časti čísla 0, môžeme dostať nesprávny výsledok. Keďže povaha nášho MNIST datasetu je taká, že všetky čísla sú centrované a správne umiestnené, perceptron sa na to spolieha pri rozlišovaní medzi číslami.\n",
"\n",
"Teraz vyskúšajme rôzne číslice:\n"
"Teraz vyskúšajme rôzne čísla:\n"
]
},
{
@ -911,11 +913,11 @@
"source": [
"## Diskusia\n",
"\n",
"Z nejakého dôvodu nie sú 2 a 5 tak ľahko oddeliteľné. Aj keď dosahujeme relatívne vysokú presnosť (nad 85 %), môžeme jasne vidieť, ako sa perceptron v určitom bode prestáva učiť.\n",
"Z nejakého dôvodu nie sú čísla 2 a 5 tak ľahko oddeliteľné. Aj keď dosahujeme pomerne vysokú presnosť (nad 85 %), je zrejmé, že perceptron prestáva v určitom bode učiť.\n",
"\n",
"Aby sme pochopili, prečo sa to deje, môžeme skúsiť použiť [Analýzu hlavných komponentov](https://en.wikipedia.org/wiki/Principal_component_analysis) (PCA). Ide o techniku strojového učenia, ktorá sa používa na zníženie dimenzionality vstupného datasetu tak, aby sa dosiahla čo najlepšia oddeliteľnosť medzi triedami.\n",
"Aby sme pochopili, prečo sa to deje, môžeme použiť [Analýzu hlavných komponentov](https://en.wikipedia.org/wiki/Principal_component_analysis) (PCA). Ide o techniku strojového učenia, ktorá sa používa na zníženie dimenzionality vstupného datasetu tak, aby sa dosiahla čo najlepšia oddeliteľnosť medzi triedami.\n",
"\n",
"V našom prípade má vstupný obrázok 784 pixelov (vstupných vlastností) a chceme použiť PCA na zníženie počtu parametrov na iba 2, aby sme ich mohli vykresliť na grafe. Tieto dva parametre by boli lineárnou kombináciou pôvodných vlastností a môžeme tento postup vnímať ako „otáčanie“ nášho pôvodného 784-dimenzionálneho priestoru a pozorovanie jeho projekcie do nášho 2D-priestoru, až kým nezískame najlepší pohľad, ktorý triedy oddeľuje.\n"
"V našom prípade má vstupný obrázok 784 pixelov (vstupných vlastností) a chceme použiť PCA na zníženie počtu parametrov na iba 2, aby sme ich mohli zobraziť na grafe. Tieto dva parametre by boli lineárnou kombináciou pôvodných vlastností a tento postup si môžeme predstaviť ako „otáčanie“ nášho pôvodného 784-dimenzionálneho priestoru a pozorovanie jeho projekcie do 2D priestoru, až kým nezískame najlepší pohľad, ktorý triedy oddeľuje.\n"
]
},
{
@ -1025,17 +1027,17 @@
}
},
"source": [
"Ako vidíte, 0 a 1 môžeme jasne oddeliť priamkou. To naznačuje, že v pôvodnom 784-rozmernom priestore sú body zodpovedajúce čísliciam tiež lineárne oddeliteľné. V prípade 2 a 5 však nemôžeme nájsť dobrú projekciu, ktorá by číslice jasne oddelila, a preto dochádza k niektorým nesprávnym klasifikáciám.\n",
"Ako vidíte, čísla 0 a 1 je možné jasne oddeliť priamkou. To naznačuje, že v pôvodnom 784-rozmernom priestore sú body zodpovedajúce čísliciam tiež lineárne oddeliteľné. V prípade číslic 2 a 5 však nemôžeme nájsť vhodnú projekciu, ktorá by číslice jasne oddelila, a preto dochádza k niektorým nesprávnym klasifikáciám.\n",
"\n",
"> Neskôr v tomto kurze sa naučíme, ako vytvárať nelineárne klasifikátory pomocou neurónových sietí a ako riešiť problém nesprávne zarovnaných číslic. Veľmi skoro dosiahneme presnosť nad 99 % pri klasifikácii číslic MNIST, pričom ich budeme klasifikovať do 10 rôznych tried.\n",
"> Neskôr v tomto kurze sa naučíme, ako vytvárať nelineárne klasifikátory pomocou neurónových sietí a ako riešiť problém nesprávne zarovnaných číslic. Veľmi skoro dosiahneme presnosť nad 99 % pri klasifikácii číslic MNIST, pričom ich budeme rozdeľovať do 10 rôznych tried.\n",
"\n",
"## Zhrnutie\n",
"\n",
" * Naučili sme sa o najjednoduchšej architektúre neurónovej siete - jednovrstvovom perceptróne.\n",
" * Implementovali sme perceptrón \"ručne\" pomocou jednoduchého tréningového postupu založeného na gradientnom zostupe.\n",
" * Napriek svojej jednoduchosti dokáže jednovrstvový perceptrón riešiť pomerne zložité problémy rozpoznávania rukou písaných číslic.\n",
" * Jednovrstvový perceptrón je lineárny klasifikátor, a preto poskytuje rovnakú klasifikačnú silu ako logistická regresia.\n",
" * V priestore vzoriek dokáže perceptrón oddeliť dve triedy vstupných údajov pomocou hyperroviny.\n"
" * Naučili sme sa o najjednoduchšej architektúre neurónovej siete jednovrstvovom perceptrone.\n",
" * Implementovali sme perceptron „ručne“ pomocou jednoduchého tréningového postupu založeného na gradientnom zostupe.\n",
" * Napriek jednoduchosti dokáže jednovrstvový perceptron riešiť pomerne zložité problémy rozpoznávania ručne písaných číslic.\n",
" * Jednovrstvový perceptron je lineárny klasifikátor, a preto poskytuje rovnakú klasifikačnú silu ako logistická regresia.\n",
" * V priestore vzoriek dokáže perceptron oddeliť dve triedy vstupných dát pomocou hyperroviny.\n"
]
},
{
@ -1051,7 +1053,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Upozornenie**: \nTento dokument bol preložený pomocou služby AI prekladu [Co-op Translator](https://github.com/Azure/co-op-translator). Aj keď sa snažíme o presnosť, prosím, berte na vedomie, že automatizované preklady môžu obsahovať chyby alebo nepresnosti. Pôvodný dokument v jeho pôvodnom jazyku by mal byť považovaný za autoritatívny zdroj. Pre kritické informácie sa odporúča profesionálny ľudský preklad. Nenesieme zodpovednosť za akékoľvek nedorozumenia alebo nesprávne interpretácie vyplývajúce z použitia tohto prekladu.\n"
"\n---\n\n**Upozornenie**: \nTento dokument bol preložený pomocou služby AI prekladu [Co-op Translator](https://github.com/Azure/co-op-translator). Hoci sa snažíme o presnosť, upozorňujeme, že automatizované preklady môžu obsahovať chyby alebo nepresnosti. Pôvodný dokument v jeho rodnom jazyku by mal byť považovaný za autoritatívny zdroj. Pre kritické informácie sa odporúča profesionálny ľudský preklad. Nenesieme zodpovednosť za akékoľvek nedorozumenia alebo nesprávne interpretácie vyplývajúce z použitia tohto prekladu.\n"
]
}
],
@ -1080,8 +1082,8 @@
"start_slideshow_at": "selected"
},
"coopTranslator": {
"original_hash": "914fc55f59efc7e17b8130d4033ac617",
"translation_date": "2025-08-30T00:08:00+00:00",
"original_hash": "d67e5b54ba20b507aa88d71aa3d042d8",
"translation_date": "2025-10-03T13:42:01+00:00",
"source_file": "lessons/3-NeuralNetworks/03-Perceptron/Perceptron.ipynb",
"language_code": "sk"
}

View File

@ -11,9 +11,9 @@
"source": [
"## Perceptron\n",
"\n",
"> Ta zvezek je del [Učnega načrta za začetnike v umetni inteligenci](http://github.com/microsoft/ai-for-beginners). Obiščite repozitorij za celoten nabor učnih gradiv.\n",
"> Ta zvezek je del [Učnega načrta za začetnike v AI](http://github.com/microsoft/ai-for-beginners). Obiščite repozitorij za celoten nabor učnih gradiv.\n",
"\n",
"Kot smo že omenili, perceptron omogoča reševanje **problema binarne klasifikacije**, torej razvrščanje vhodnih primerov v dva razreda - lahko jih imenujemo **pozitivni** in **negativni**.\n",
"Kot smo že razpravljali, perceptron omogoča reševanje **problema binarne klasifikacije**, tj. razvrščanje vhodnih primerov v dva razreda - lahko jih imenujemo **pozitivni** in **negativni**.\n",
"\n",
"Najprej uvozimo nekaj potrebnih knjižnic.\n"
]
@ -47,11 +47,11 @@
}
},
"source": [
"## Igralni problem\n",
"## Igrača problem\n",
"\n",
"Za začetek si oglejmo preprost problem, kjer imamo dve vhodni značilnosti. Na primer, v medicini bi morda želeli razvrstiti tumorje v benigne in maligne glede na njihovo velikost in starost.\n",
"Za začetek se lotimo igrača problema, kjer imamo dve vhodni značilnosti. Na primer, v medicini želimo razvrstiti tumorje v benigne in maligne, odvisno od njihove velikosti in starosti.\n",
"\n",
"Ustvarili bomo naključni razvrstitveni nabor podatkov z uporabo funkcije `make_classification` iz knjižnice SciKit Learn:\n"
"Naključno klasifikacijsko podatkovno zbirko bomo ustvarili z uporabo funkcije `make_classification` iz knjižnice SciKit Learn:\n"
]
},
{
@ -154,11 +154,11 @@
"source": [
"## Perceptron\n",
"\n",
"Ker je perceptron binarni klasifikator, bo za vsak vhodni vektor $x$ izhod našega perceptrona bodisi +1 ali -1, odvisno od razreda. Izhod se izračuna po formuli\n",
"Ker je perceptron binarni klasifikator, bo za vsak vhodni vektor $x$ izhod našega perceptrona bodisi +1 ali -1, odvisno od razreda. Izhod se bo izračunal po formuli\n",
"\n",
"$$y(\\mathbf{x}) = f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x})$$\n",
"\n",
"kjer je $\\mathbf{w}$ vektorska utež, $f$ pa je stopničasta aktivacijska funkcija:\n",
"kjer je $\\mathbf{w}$ vektorska teža, $f$ pa funkcija aktivacije tipa stopnica:\n",
"$$\n",
"f(x) = \\begin{cases}\n",
" +1 & x \\geq 0 \\\\\n",
@ -166,7 +166,7 @@
" \\end{cases} \\\\\n",
"$$\n",
"\n",
"Vendar pa bi splošni linearni model moral imeti tudi pristranskost (bias), tj. idealno bi morali $y$ izračunati kot $y=f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}+\\mathbf{b})$. Da poenostavimo naš model, se lahko znebimo tega pristranskostnega člena tako, da dodamo še eno dimenzijo našim vhodnim značilnostim, ki je vedno enaka 1:\n"
"Vendar pa bi splošni linearni model moral imeti tudi pristranskost (bias), torej bi idealno morali izračunati $y$ kot $y=f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}+\\mathbf{b})$. Da poenostavimo naš model, se lahko znebimo tega pristranskostnega člena tako, da dodamo še eno dimenzijo našim vhodnim značilnostim, ki vedno znaša 1:\n"
]
},
{
@ -206,14 +206,14 @@
"source": [
"## Algoritem za učenje\n",
"\n",
"Da bi naučili perceptron, moramo določiti uteži $\\mathbf{w}$, ki bodo minimizirale napako. Napaka je definirana z uporabo **perceptronskega kriterija**:\n",
"Da bi trenirali perceptron, moramo določiti uteži $\\mathbf{w}$, ki bodo minimizirale napako. Napaka je definirana z uporabo **kriterija perceptrona**:\n",
"\n",
"$$E(\\mathbf{w}) = -\\sum_{n \\in \\mathcal{M}}\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}_{n}t_{n}$$\n",
" \n",
" * $t_{n} \\in \\{-1, +1\\}$ za negativne in pozitivne učne primere\n",
" * $t_{n} \\in \\{-1, +1\\}$ za negativne in pozitivne učne vzorce\n",
" * $\\mathcal{M}$ - množica napačno klasificiranih primerov\n",
" \n",
"Uporabili bomo postopek **gradientnega spusta**. Začnemo z začetnimi naključnimi utežmi $\\mathbf{w}^{(0)}$, nato pa na vsakem koraku učenja prilagodimo uteži z uporabo gradienta $E$:\n",
"Uporabili bomo proces **gradientnega spusta**. Začnemo z naključnimi začetnimi utežmi $\\mathbf{w}^{(0)}$ in jih prilagajamo na vsakem koraku učenja z uporabo gradienta $E$:\n",
"\n",
"$$\\mathbf{w}^{\\tau + 1}=\\mathbf{w}^{\\tau} - \\eta \\nabla E(\\mathbf{w}) = \\mathbf{w}^{\\tau} + \\eta\\sum_{n \\in \\mathcal{M}}\\mathbf{x}_{n} t_{n}$$\n",
"\n",
@ -311,9 +311,9 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Kot lahko vidite, je začetna natančnost približno 50 %, vendar se hitro poveča na višje vrednosti, blizu 90 %.\n",
"Kot lahko vidite, je začetna natančnost okoli 50 %, vendar se hitro poveča na višje vrednosti, blizu 90 %.\n",
"\n",
"Vizualizirajmo, kako so razredi ločeni. Naša funkcija za klasifikacijo je videti kot $\\mathbf{w}^Tx$, in je večja od 0 za en razred, ter manjša od 0 za drugi razred. Tako je ločilna črta med razredi definirana z $\\mathbf{w}^Tx = 0$. Ker imamo le dve dimenziji $x_0$ in $x_1$, bi bila enačba za črto $w_0x_0+w_1x_1+w_2 = 0$ (spomnite se, da smo izrecno definirali dodatno dimenzijo $x_2=1$). Narišimo to črto:\n"
"Vizualizirajmo, kako so razredi ločeni. Naša funkcija za klasifikacijo je videti kot $\\mathbf{w}^Tx$, in je večja od 0 za en razred, ter manjša od 0 za drugi razred. Tako je ločilna črta med razredi definirana z $\\mathbf{w}^Tx = 0$. Ker imamo le dve dimenziji $x_0$ in $x_1$, bi bila enačba za črto $w_0x_0+w_1x_1+w_2 = 0$ (spomnite se, da smo eksplicitno definirali dodatno dimenzijo $x_2=1$). Narišimo to črto:\n"
]
},
{
@ -381,7 +381,7 @@
"source": [
"## Ocenjevanje na testnem naboru podatkov\n",
"\n",
"Na začetku smo nekaj podatkov ločili za testni nabor podatkov. Poglejmo, kako natančen je naš klasifikator na tem testnem naboru podatkov. Da to dosežemo, razširimo testni nabor podatkov z dodatno dimenzijo, pomnožimo z matriko uteži in se prepričamo, da je pridobljena vrednost istega predznaka kot oznaka (+1 ali -1). Nato seštejemo vse logične vrednosti in jih delimo z dolžino testnega vzorca, da dobimo natančnost:\n"
"Na začetku smo nekaj podatkov ločili za testni nabor. Poglejmo, kako natančen je naš klasifikator na tem testnem naboru podatkov. Da to dosežemo, razširimo testni nabor podatkov z dodatno dimenzijo, pomnožimo z matriko uteži in se prepričamo, da je pridobljena vrednost istega predznaka kot oznaka (+1 ali -1). Nato seštejemo vse logične vrednosti in jih delimo z dolžino testnega vzorca, da dobimo natančnost:\n"
]
},
{
@ -422,7 +422,7 @@
"source": [
"## Opazovanje procesa učenja\n",
"\n",
"Prej smo videli, kako se natančnost zmanjšuje med učenjem. Bilo bi zanimivo videti, kako se ločilna črta obnaša med procesom učenja. Spodnja koda bo vse prikazala na enem grafu, vi pa boste lahko premikali drsnik, da \"potujete skozi čas\" med procesom učenja.\n"
"Prej smo videli, kako se natančnost zmanjšuje med procesom učenja. Lepo bi bilo videti, kako se ločilna črta spreminja med učenjem. Spodnja koda bo vse prikazala na enem grafu, vi pa boste lahko premikali drsnik, da \"potujete skozi čas\" med procesom učenja.\n"
]
},
{
@ -605,19 +605,19 @@
}
},
"source": [
"Kot lahko vidite iz zgornjega grafa, natančnost nikoli ne preseže 75 %, ker je nemogoče narisati ravno črto tako, da bi pravilno zajeli vse možne primere.\n",
"Kot lahko vidite iz zgornjega grafa, natančnost nikoli ne preseže 75 %, saj je nemogoče narisati ravno črto tako, da bi pravilno zajeli vse možne primere.\n",
"\n",
"Problem XOR je klasičen primer omejitev perceptrona, na kar sta leta 1969 opozorila Marvin Minsky in Seymour Papert v svoji knjigi [Perceptrons](https://en.wikipedia.org/wiki/Perceptrons_(book)). To opažanje je skoraj za 10 let omejilo raziskave na področju nevronskih mrež, čeprav - kot bomo videli v naslednjem poglavju našega tečaja - večslojni perceptroni zlahka rešujejo takšne probleme.\n",
"Problem XOR je klasičen primer omejitev perceptrona, na kar sta leta 1969 opozorila Marvin Minsky in Seymour Papert v svoji knjigi [Perceptrons](https://en.wikipedia.org/wiki/Perceptrons_(book)). To opažanje je za skoraj 10 let omejilo raziskave na področju nevronskih mrež, čeprav - kot bomo videli v naslednjem poglavju našega tečaja - večplastni perceptroni povsem zmorejo reševati takšne probleme.\n",
"\n",
"## Kompleksen primer - MNIST\n",
"\n",
"Čeprav perceptron ne more rešiti problema XOR, lahko reši veliko bolj kompleksne probleme, kot je prepoznavanje ročno napisanih znakov.\n",
"\n",
"Podatkovni niz, ki se pogosto uporablja pri učenju strojnega učenja, se imenuje [MNIST](https://en.wikipedia.org/wiki/MNIST_database). Ustvaril ga je spremenjeni Nacionalni inštitut za standarde in tehnologijo (Modified National Institute of Standards and Technology) in vsebuje učni niz s 60.000 ročno napisanimi števkami, zbranimi od približno 250 študentov in zaposlenih na inštitutu. Obstaja tudi testni podatkovni niz z 10.000 števkami, zbranimi od različnih posameznikov.\n",
"Podatkovni niz, ki se pogosto uporablja pri učenju strojnega učenja, se imenuje [MNIST](https://en.wikipedia.org/wiki/MNIST_database). Ustvaril ga je spremenjeni Nacionalni inštitut za standarde in tehnologijo ter vsebuje učni niz 60.000 ročno napisanih številk, zbranih od približno 250 študentov in zaposlenih na inštitutu. Obstaja tudi testni podatkovni niz s 10.000 številkami, zbranimi od različnih posameznikov.\n",
"\n",
"Vse števke so predstavljene kot sivinske slike velikosti 28x28 pik.\n",
"Vse številke so predstavljene kot sivinske slike velikosti 28x28 pik.\n",
"\n",
"> Podatkovni niz MNIST je na voljo kot tekmovanje za učenje na [Kaggle](https://www.kaggle.com/c/digit-recognizer), spletni strani, ki gosti tekmovanja in izzive s področja strojnega učenja. Ko se naučite razvrščati števke iz MNIST, lahko svojo rešitev oddate na Kaggle in preverite, kako je ocenjena v primerjavi z drugimi udeleženci.\n",
"> Podatkovni niz MNIST je na voljo kot tekmovanje za učenje na [Kaggle](https://www.kaggle.com/c/digit-recognizer), spletni strani, ki gosti tekmovanja in natečaje s področja strojnega učenja. Ko se naučite razvrščati številke iz MNIST, lahko svojo rešitev oddate na Kaggle in preverite, kako je ocenjena med drugimi udeleženci.\n",
"\n",
"Začnemo z nalaganjem podatkovnega niza MNIST:\n"
]
@ -695,7 +695,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Ker je perceptron binarni klasifikator, bomo našo nalogo omejili na prepoznavanje samo dveh številk. Spodnja funkcija bo napolnila polja pozitivnih in negativnih vzorcev z dvema danima številkama (in bo za jasnost prikazala tudi vzorce teh številk).\n"
"Ker je perceptron binarni klasifikator, bomo našo težavo omejili na prepoznavanje samo dveh številk. Spodnja funkcija bo napolnila pozitivne in negativne vzorčne matrike z dvema danima številkama (in bo za jasnost prikazala tudi vzorce teh številk).\n"
]
},
{
@ -831,13 +831,13 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Prosimo, opazite, kako natančnost zelo hitro doseže skoraj 100 %.\n",
"Upoštevajte, kako natančnost zelo hitro naraste skoraj do 100%.\n",
"\n",
"Prosimo, premaknite drsnik na neko pozicijo proti koncu treninga in opazujte matriko uteži, prikazano na levi. Ta matrika vam bo omogočila, da razumete, kako perceptron dejansko deluje. Vidite lahko visoke vrednosti uteži na sredini polja, ki ustrezajo pikslom, ki so običajno prisotni pri številki 1, in nizke negativne vrednosti ob straneh, kjer so deli številke 0. Torej, če je številka, predstavljena perceptronu, dejansko 1, bo njen srednji del pomnožen z visokimi vrednostmi, kar bo dalo pozitiven rezultat. Nasprotno pa, ko perceptron opazuje številko 0, bodo ustrezni piksli pomnoženi z negativnimi številkami.\n",
"Prosimo, premaknite drsnik na položaj proti koncu učenja in opazujte matriko uteži, prikazano na levi. Ta matrika vam bo omogočila razumeti, kako perceptron dejansko deluje. Vidite lahko visoke vrednosti uteži na sredini polja, ki ustrezajo pikslom, ki so običajno prisotni pri številki 1, ter nizke negativne vrednosti ob straneh, kjer so deli številke 0. Torej, če je številka, predstavljena perceptronu, dejansko 1, bo njen srednji del pomnožen z visokimi vrednostmi, kar bo dalo pozitiven rezultat. Nasprotno pa, ko perceptron opazuje številko 0, bodo ustrezni piksli pomnoženi z negativnimi vrednostmi.\n",
"\n",
"> Morda boste opazili, da če perceptronu podamo številko 1, ki je rahlo premaknjena vodoravno, tako da njeni piksli zasedajo mesto, kjer so vertikalni deli številke 0, lahko dobimo napačen rezultat. Ker je narava našega MNIST nabora podatkov takšna, da so vse številke centrirane in pravilno pozicionirane, perceptron pa se zanaša na to, da razlikuje med številkami.\n",
"> Opazite lahko, da če perceptronu podamo številko 1, ki je rahlo premaknjena horizontalno, tako da njeni piksli zasedajo mesto, kjer so vertikalni deli številke 0, lahko dobimo napačen rezultat. Narava našega MNIST nabora podatkov je namreč takšna, da so vse številke centrirane in pravilno pozicionirane, perceptron pa se zanaša na to, da razlikuje med številkami.\n",
"\n",
"Zdaj poskusimo različne številke:\n"
"Zdaj poskusimo z različnimi številkami:\n"
]
},
{
@ -913,11 +913,11 @@
"source": [
"## Razprava\n",
"\n",
"Iz nekega razloga 2 in 5 nista tako enostavno ločljivi. Čeprav dosežemo relativno visoko natančnost (nad 85 %), lahko jasno opazimo, kako se perceptron na neki točki preneha učiti.\n",
"Iz nekega razloga 2 in 5 nista tako enostavno ločljivi. Čeprav dosežemo razmeroma visoko natančnost (nad 85 %), lahko jasno opazimo, kako perceptron na neki točki preneha učiti.\n",
"\n",
"Da bi razumeli, zakaj se to dogaja, lahko poskusimo uporabiti [glavno komponentno analizo](https://en.wikipedia.org/wiki/Principal_component_analysis) (PCA). To je tehnika strojnega učenja, ki se uporablja za zmanjšanje dimenzionalnosti vhodnega nabora podatkov na način, da dosežemo najboljšo ločljivost med razredi.\n",
"Da bi razumeli, zakaj se to zgodi, lahko poskusimo uporabiti [Glavno komponentno analizo](https://en.wikipedia.org/wiki/Principal_component_analysis) (PCA). To je tehnika strojnega učenja, ki se uporablja za zmanjšanje dimenzionalnosti vhodnega nabora podatkov, tako da dosežemo najboljšo ločljivost med razredi.\n",
"\n",
"V našem primeru ima vhodna slika 784 pikslov (vhodnih značilnosti), mi pa želimo uporabiti PCA za zmanjšanje števila parametrov na samo 2, da jih lahko prikažemo na grafu. Ti dve parametri bi bili linearna kombinacija izvirnih značilnosti, ta postopek pa si lahko predstavljamo kot \"vrtenje\" našega izvirnega 784-dimenzionalnega prostora in opazovanje njegove projekcije v naš 2D-prostor, dokler ne dobimo najboljšega pogleda, ki ločuje razrede.\n"
"V našem primeru ima vhodna slika 784 pikslov (vhodnih značilnosti), mi pa želimo uporabiti PCA, da zmanjšamo število parametrov na samo 2, da jih lahko prikažemo na grafu. Ti dva parametra bi bila linearna kombinacija izvirnih značilnosti, ta postopek pa si lahko predstavljamo kot \"vrtenje\" našega izvirnega 784-dimenzionalnega prostora in opazovanje njegove projekcije v 2D-prostor, dokler ne dobimo najboljše perspektive, ki ločuje razrede.\n"
]
},
{
@ -1027,17 +1027,17 @@
}
},
"source": [
"Kot lahko vidite, lahko 0 in 1 jasno ločimo z ravno črto. To kaže, da so v prvotnem 784-dimenzionalnem prostoru točke, ki ustrezajo številkam, tudi linearno ločljive. V primeru 2 in 5 pa ne moremo najti dobre projekcije, ki bi številke jasno ločila, zato pride do nekaterih primerov napačne klasifikacije.\n",
"Kot lahko vidite, 0 in 1 je mogoče jasno ločiti z ravno črto. To kaže, da so v prvotnem 784-dimenzionalnem prostoru točke, ki ustrezajo številkam, tudi linearno ločljive. V primeru 2 in 5 ne moremo najti dobre projekcije, ki bi jasno ločila številke, zato pride do nekaterih primerov napačne klasifikacije.\n",
"\n",
"> Kasneje v tem tečaju se bomo naučili, kako ustvariti nelinearne klasifikatorje z uporabo nevronskih mrež in kako se spoprijeti s problemom, ko številke niso pravilno poravnane. Zelo kmalu bomo dosegli več kot 99 % natančnost pri klasifikaciji številk MNIST, pri čemer jih bomo razvrstili v 10 različnih razredov.\n",
"> Kasneje v tem tečaju se bomo naučili, kako ustvariti nelinearne klasifikatorje z uporabo nevronskih mrež in kako se spopasti s težavo, ko številke niso pravilno poravnane. Zelo kmalu bomo dosegli več kot 99 % natančnost pri klasifikaciji številk MNIST, medtem ko jih bomo razvrščali v 10 različnih razredov.\n",
"\n",
"## Ključne točke\n",
"\n",
" * Spoznali smo najpreprostejšo arhitekturo nevronske mreže - enoslojni perceptron.\n",
" * Perceptron smo implementirali \"ročno\" z uporabo preprostega učnega postopka, ki temelji na gradientnem spustu.\n",
" * Perceptron smo implementirali \"ročno\" z uporabo preprostega postopka učenja, ki temelji na gradientnem spustu.\n",
" * Kljub preprostosti lahko enoslojni perceptron reši precej zapletene probleme prepoznavanja ročno napisanih številk.\n",
" * Enoslojni perceptron je linearen klasifikator, zato ponuja enako klasifikacijsko moč kot logistična regresija.\n",
" * V vzorčnem prostoru lahko perceptron loči dva razreda vhodnih podatkov z uporabo hiperravnine.\n"
" * Enoslojni perceptron je linearni klasifikator, zato ponuja enako klasifikacijsko moč kot logistična regresija.\n",
" * V vzorčnem prostoru lahko perceptron loči dva razreda vhodnih podatkov z uporabo hiperploskve.\n"
]
},
{
@ -1053,7 +1053,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Omejitev odgovornosti**: \nTa dokument je bil preveden z uporabo storitve za prevajanje z umetno inteligenco [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da upoštevate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem maternem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo profesionalni človeški prevod. Ne prevzemamo odgovornosti za morebitna nesporazumevanja ali napačne razlage, ki bi nastale zaradi uporabe tega prevoda.\n"
"\n---\n\n**Omejitev odgovornosti**: \nTa dokument je bil preveden z uporabo storitve AI za prevajanje [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da upoštevate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem maternem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo profesionalni človeški prevod. Ne prevzemamo odgovornosti za morebitna nesporazumevanja ali napačne razlage, ki izhajajo iz uporabe tega prevoda.\n"
]
}
],
@ -1082,8 +1082,8 @@
"start_slideshow_at": "selected"
},
"coopTranslator": {
"original_hash": "914fc55f59efc7e17b8130d4033ac617",
"translation_date": "2025-08-30T07:47:44+00:00",
"original_hash": "d67e5b54ba20b507aa88d71aa3d042d8",
"translation_date": "2025-10-03T13:47:12+00:00",
"source_file": "lessons/3-NeuralNetworks/03-Perceptron/Perceptron.ipynb",
"language_code": "sl"
}

View File

@ -49,7 +49,7 @@
"source": [
"## Проблем са играчком\n",
"\n",
"За почетак, хајде да кренемо са једноставним проблемом, где имамо две улазне карактеристике. На пример, у медицини можемо желети да класификујемо туморе као бенигне и малигне, у зависности од њихове величине и старости.\n",
"За почетак, хајде да кренемо са проблемом са играчком, где имамо две улазне карактеристике. На пример, у медицини можемо желети да класификујемо туморе као бенигне и малигне, у зависности од њихове величине и старости.\n",
"\n",
"Генерисаћемо насумични класификациони скуп података користећи функцију `make_classification` из библиотеке SciKit Learn:\n"
]
@ -154,11 +154,11 @@
"source": [
"## Перцептрон\n",
"\n",
"Пошто је перцептрон бинарни класификатор, за сваки улазни вектор $x$ излаз нашег перцептрона биће или +1 или -1, у зависности од класе. Излаз ће се израчунати помоћу формуле\n",
"Пошто је перцептрон бинарни класификатор, за сваки улазни вектор $x$ излаз нашег перцептрона биће или +1 или -1, у зависности од класе. Излаз ће се рачунати помоћу формуле\n",
"\n",
"$$y(\\mathbf{x}) = f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x})$$\n",
"\n",
"где је $\\mathbf{w}$ вектор тежина, а $f$ је активациона функција корака:\n",
"где је $\\mathbf{w}$ вектор тежина, а $f$ је функција активације типа степен:\n",
"$$\n",
"f(x) = \\begin{cases}\n",
" +1 & x \\geq 0 \\\\\n",
@ -166,7 +166,7 @@
" \\end{cases} \\\\\n",
"$$\n",
"\n",
"Међутим, општи линеарни модел би такође требало да има пристрасност (bias), тј. идеално би требало да израчунамо $y$ као $y=f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}+\\mathbf{b})$. Да бисмо поједноставили наш модел, можемо елиминисати овај термин пристрасности додавањем још једне димензије нашим улазним карактеристикама, која увек има вредност 1:\n"
"Међутим, општи линеарни модел би требало да има и пристрасност (bias), тј. идеално би требало да рачунамо $y$ као $y=f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}+\\mathbf{b})$. Да бисмо поједноставили наш модел, можемо елиминисати овај термин пристрасности додавањем још једне димензије нашим улазним карактеристикама, која увек има вредност 1:\n"
]
},
{
@ -206,18 +206,18 @@
"source": [
"## Алгоритам за тренирање\n",
"\n",
"Да бисмо обучили перцептрон, потребно је да пронађемо тежине $\\mathbf{w}$ које ће минимизовати грешку. Грешка се дефинише помоћу **перцептрон критеријума**:\n",
"Да бисмо обучили перцептрон, потребно је да пронађемо тежине $\\mathbf{w}$ које ће минимизирати грешку. Грешка је дефинисана помоћу **критеријума перцептрона**:\n",
"\n",
"$$E(\\mathbf{w}) = -\\sum_{n \\in \\mathcal{M}}\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}_{n}t_{n}$$\n",
" \n",
" * $t_{n} \\in \\{-1, +1\\}$ за негативне и позитивне примере у тренинг скупу, респективно\n",
" * $t_{n} \\in \\{-1, +1\\}$ за негативне и позитивне узорке за тренирање, респективно\n",
" * $\\mathcal{M}$ - скуп погрешно класификованих примера\n",
" \n",
"Користићемо процес **градијентског спуштања**. Почевши од неких иницијалних случајних тежина $\\mathbf{w}^{(0)}$, прилагођаваћемо тежине на сваком кораку тренинга користећи градијент $E$:\n",
"Користићемо процес **градијентског спуштања**. Почевши од неких почетних случајних тежина $\\mathbf{w}^{(0)}$, прилагођаваћемо тежине на сваком кораку тренинга користећи градијент $E$:\n",
"\n",
"$$\\mathbf{w}^{\\tau + 1}=\\mathbf{w}^{\\tau} - \\eta \\nabla E(\\mathbf{w}) = \\mathbf{w}^{\\tau} + \\eta\\sum_{n \\in \\mathcal{M}}\\mathbf{x}_{n} t_{n}$$\n",
"\n",
"где је $\\eta$ **коефицијент учења**, а $\\tau\\in\\mathbb{N}$ - број итерација.\n",
"где је $\\eta$ **стопа учења**, а $\\tau\\in\\mathbb{N}$ - број итерација.\n",
"\n",
"Хајде да дефинишемо овај алгоритам у Python-у:\n"
]
@ -271,7 +271,9 @@
{
"cell_type": "markdown",
"metadata": {},
"source": []
"source": [
"Сада хајде да покренемо обуку на нашем скупу података:\n"
]
},
{
"cell_type": "code",
@ -309,9 +311,9 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Као што видите, почетна тачност је око 50%, али брзо расте до виших вредности близу 90%.\n",
"Као што можете видети, почетна тачност је око 50%, али брзо расте до виших вредности близу 90%.\n",
"\n",
"Хајде да визуализујемо како су класе раздвојене. Наша функција класификације изгледа као $\\mathbf{w}^Tx$, и она је већа од 0 за једну класу, а мања од 0 за другу. Дакле, линија која раздваја класе је дефинисана са $\\mathbf{w}^Tx = 0$. Пошто имамо само две димензије $x_0$ и $x_1$, једначина за линију би била $w_0x_0+w_1x_1+w_2 = 0$ (запамтите да смо експлицитно дефинисали додатну димензију $x_2=1$). Хајде да нацртамо ову линију:\n"
"Хајде да визуализујемо како су класе раздвојене. Наша функција класификације изгледа као $\\mathbf{w}^Tx$, и она је већа од 0 за једну класу, а мања од 0 за другу. Дакле, линија раздвајања класа је дефинисана са $\\mathbf{w}^Tx = 0$. Пошто имамо само две димензије $x_0$ и $x_1$, једначина за линију би била $w_0x_0+w_1x_1+w_2 = 0$ (запамтите да смо експлицитно дефинисали додатну димензију $x_2=1$). Хајде да нацртамо ову линију:\n"
]
},
{
@ -377,9 +379,9 @@
}
},
"source": [
"## Процена на тест датасету\n",
"## Тестирање на тест сету података\n",
"\n",
"На почетку смо издвојили део података за тест датасет. Хајде да видимо колико је наш класификатор тачан на овом тест датасету. Да бисмо то урадили, проширујемо тест датасет са додатном димензијом, множимо га са матрицом тежина и проверавамо да ли добијена вредност има исти знак као и ознака (+1 или -1). Затим сабирамо све булове вредности и делимо их са дужином тест узорка, како бисмо добили тачност:\n"
"На почетку смо издвојили део података за тест сет. Хајде да проверимо колико је наш класификатор тачан на овом тест сету. Да бисмо то урадили, проширујемо тест сет са додатном димензијом, множимо са матрицом тежина и проверавамо да ли добијена вредност има исти знак као и ознака (+1 или -1). Затим сабирамо све булове вредности и делимо са дужином тест узорка како бисмо добили тачност:\n"
]
},
{
@ -418,9 +420,9 @@
}
},
"source": [
"## Посматрање процеса обуке\n",
"## Посматрање процеса тренинга\n",
"\n",
"Видели смо раније како се тачност смањује током обуке. Било би занимљиво видети како се линија раздвајања понаша током обуке. Код испод ће све визуализовати на једном графику, и требало би да можете да померате клизач како бисте \"путовали кроз време\" током процеса обуке.\n"
"Видели смо раније како се тачност смањује током тренинга. Било би занимљиво видети како се линија раздвајања понаша током тренинга. Код испод ће визуализовати све на једном графику, и требало би да можете да померате клизач како бисте \"путовали кроз време\" током процеса тренинга.\n"
]
},
{
@ -527,7 +529,7 @@
"source": [
"## Ограничења перцептрона\n",
"\n",
"Као што сте видели горе, перцептрон је **линеарни класификатор**. Он може добро да разликује између две класе ако су оне **линеарно раздвојиве**, тј. ако могу бити раздвојене правом линијом. У супротном, процес тренирања перцептрона неће конвергирати.\n",
"Као што сте видели изнад, перцептрон је **линеарни класификатор**. Он може добро да разликује две класе ако су **линеарно раздвојиве**, односно ако могу бити раздвојене правом линијом. У супротном, процес тренинга перцептрона неће конвергирати.\n",
"\n",
"Најочигледнији пример проблема који не може бити решен перцептроном је такозвани **XOR проблем**. Желимо да наш перцептрон научи XOR булову функцију, која има следећу табелу истине:\n",
"\n",
@ -536,7 +538,7 @@
"| 0 | 0 | 1 | \n",
"| 1 | 1 | 0 |\n",
"\n",
"Хајде да покушамо то! Ручно ћемо попунити све позитивне и негативне узорке за тренирање, а затим позвати нашу функцију train дефинисану горе:\n"
"Хајде да пробамо! Ручно ћемо попунити све позитивне и негативне узорке за тренинг, а затим позвати нашу функцију за тренинг дефинисану изнад:\n"
]
},
{
@ -603,7 +605,7 @@
}
},
"source": [
"Као што можете видети из горњег графикона, тачност никада не прелази 75%, јер је немогуће повући праву линију тако да обухвати све могуће примере.\n",
"Као што можете видети из графика изнад, тачност никада не прелази 75%, јер је немогуће нацртати праву линију тако да обухвати све могуће примере.\n",
"\n",
"Проблем XOR је класичан пример ограничења перцептрона, а на њега су указали Марвин Мински и Симор Паперт 1969. године у својој књизи [Perceptrons](https://en.wikipedia.org/wiki/Perceptrons_(book)). Ово запажање је ограничило истраживања у области неуронских мрежа скоро 10 година, иако - као што ћемо видети у следећем делу нашег курса - перцептрони са више слојева могу савршено решити овакве проблеме.\n",
"\n",
@ -611,11 +613,11 @@
"\n",
"Иако перцептрон не може решити XOR проблем, он може решити много сложеније проблеме, као што је препознавање руком писаних карактера.\n",
"\n",
"Скуп података који се често користи приликом савладавања машинског учења назива се [MNIST](https://en.wikipedia.org/wiki/MNIST_database). Направљен је од стране Модификованог Националног Института за Стандарде и Технологију и садржи скуп за обуку од 60000 руком писаних цифара, прикупљених од око 250 студената и запослених у институту. Постоји и тестни скуп података од 10000 цифара, прикупљених од различитих особа.\n",
"Скуп података који се често користи приликом савладавања машинског учења назива се [MNIST](https://en.wikipedia.org/wiki/MNIST_database). Овај скуп је креиран од стране Модификованог Националног института за стандарде и технологију и садржи скуп за обуку од 60.000 руком писаних цифара, прикупљених од око 250 студената и запослених у институту. Постоји и тестни скуп података од 10.000 цифара, прикупљених од различитих особа.\n",
"\n",
"Све цифре су представљене сликама у нијансама сиве величине 28x28 пиксела.\n",
"Све цифре су представљене сликама у сивим тоновима величине 28x28 пиксела.\n",
"\n",
"> MNIST скуп података је доступан као такмичење за обуку на [Kaggle](https://www.kaggle.com/c/digit-recognizer), сајту који организује такмичења и конкурсе у машинском учењу. Када научите како да класификујете MNIST цифре, можете послати своје решење на Kaggle да видите како је оцењено међу осталим учесницима.\n",
"> MNIST скуп података је доступан као такмичење за обуку на [Kaggle](https://www.kaggle.com/c/digit-recognizer), сајту који организује такмичења и конкурсе у машинском учењу. Када научите како да класификујете MNIST цифре, можете послати своје решење на Kaggle да видите како се рангира међу осталим учесницима.\n",
"\n",
"Почињемо учитавањем MNIST скупа података:\n"
]
@ -693,7 +695,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Пошто је перцептрон бинарни класификатор, ограничићемо наш проблем на препознавање само два броја. Функција испод ће попунити низове позитивних и негативних узорака са два дата броја (и такође ће приказати узорке тих бројева ради јасноће).\n"
"Зато што је перцептрон бинарни класификатор, ограничићемо наш проблем на препознавање само две цифре. Функција испод ће попунити низове позитивних и негативних узорака са две дате цифре (и такође ће приказати узорке тих цифара ради јасноће).\n"
]
},
{
@ -829,11 +831,11 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Имајте у виду како тачност веома брзо достиже скоро 100%.\n",
"Имајте на уму како тачност веома брзо достиже скоро 100%.\n",
"\n",
"Молимо вас, померите клизач на неку позицију према крају обуке и посматрајте матрицу тежина приказану са леве стране. Ова матрица ће вам омогућити да разумете како перцептрон заправо функционише. Можете видети високе вредности тежина у средини поља, које одговарају пикселима који су типично присутни за цифру 1, и ниске негативне вредности са стране, где се налазе делови цифре 0. Дакле, ако је цифра представљена перцептрону заправо 1, њен средишњи део ће бити помножен са високим вредностима, што ће произвести позитиван резултат. Супротно томе, када перцептрон посматра цифру 0, одговарајући пиксели ће бити помножени са негативним бројевима.\n",
"Молимо вас да померите клизач на неку позицију према крају тренинга и посматрајте матрицу тежина приказану са леве стране. Ова матрица ће вам омогућити да разумете како перцептрон заправо функционише. Можете видети високе вредности тежина у средини поља, које одговарају пикселима који су обично присутни за цифру 1, и ниске негативне вредности са стране, где се налазе делови цифре 0. Дакле, ако је цифра представљена перцептрону заиста 1, њен средишњи део ће бити помножен високим вредностима, што ће произвести позитиван резултат. Насупрот томе, када перцептрон посматра цифру 0, одговарајући пиксели ће бити помножени негативним бројевима.\n",
"\n",
"> Можете приметити да ако нашем перцептрону дамо цифру 1 која је благо померена хоризонтално, тако да њени пиксели заузимају место где се налазе вертикални делови цифре 0, можемо добити нетачан резултат. Пошто је природа нашег MNIST скупа података таква да су све цифре центриране и правилно позициониране, перцептрон се ослања на то како би разликовао цифре.\n",
"> Можете приметити да ако нашем перцептрону дамо цифру 1 благо померену хоризонтално, тако да њени пиксели заузимају место где се налазе вертикални делови цифре 0, можемо добити нетачан резултат. Пошто је природа нашег MNIST скупа података таква да су све цифре центриране и правилно позициониране, перцептрон се ослања на то како би разликовао цифре.\n",
"\n",
"Сада хајде да пробамо различите цифре:\n"
]
@ -911,11 +913,11 @@
"source": [
"## Дискусија\n",
"\n",
"Из неког разлога, 2 и 5 није тако лако раздвојити. Иако добијамо релативно високу тачност (преко 85%), јасно можемо видети како перцептрон у неком тренутку престаје да учи.\n",
"Из неког разлога, бројеви 2 и 5 нису тако лако раздвојиви. Иако добијамо релативно високу тачност (изнад 85%), јасно можемо видети како перцептрон престаје да учи у одређеном тренутку.\n",
"\n",
"Да бисмо разумели зашто се то дешава, можемо покушати да користимо [Анализу главних компоненти](https://en.wikipedia.org/wiki/Principal_component_analysis) (PCA). То је техника машинског учења која се користи за смањење димензионалности улазног скупа података, на такав начин да се добије најбоља раздвојивост између класа.\n",
"\n",
"У нашем случају, улазна слика има 784 пиксела (улазне карактеристике), а ми желимо да користимо PCA да смањимо број параметара на само 2, како бисмо могли да их прикажемо на графику. Та два параметра би била линеарна комбинација оригиналних карактеристика, и овај поступак можемо посматрати као \"ротацију\" нашег оригиналног 784-димензионалног простора и посматрање његове пројекције у наш 2Д-простор, све док не добијемо најбољи приказ који раздваја класе.\n"
"У нашем случају, улазна слика има 784 пиксела (улазних карактеристика), а ми желимо да користимо PCA како бисмо смањили број параметара на само 2, тако да их можемо приказати на графику. Та два параметра би била линеарна комбинација оригиналних карактеристика, а овај поступак можемо посматрати као \"ротирање\" нашег оригиналног 784-димензионалног простора и посматрање његове пројекције на наш 2D-простор, све док не добијемо најбољи приказ који раздваја класе.\n"
]
},
{
@ -1025,17 +1027,17 @@
}
},
"source": [
"Као што можете видети, 0 и 1 могу се јасно раздвојити правом линијом. Ово указује на то да су у оригиналном 784-димензионалном простору тачке које одговарају цифрама такође линеарно раздвојиве. У случају цифара 2 и 5, не можемо пронаћи добру пројекцију која ће јасно раздвојити цифре, и због тога постоје случајеви погрешне класификације.\n",
"Као што можете видети, 0 и 1 могу бити јасно раздвојени правом линијом. Ово указује да су у оригиналном 784-димензионалном простору тачке које одговарају цифрама такође линеарно раздвојиве. У случају 2 и 5, не можемо пронаћи добру пројекцију која ће јасно раздвојити цифре, и стога постоје неки случајеви погрешне класификације.\n",
"\n",
"> Касније у овом курсу ћемо научити како да креирамо нелинеарне класификаторе користећи неуронске мреже, као и како да се носимо са проблемом цифара које нису правилно поравнате. Ускоро ћемо достићи тачност изнад 99% у класификацији цифара из MNIST скупа, класификујући их у 10 различитих класа.\n",
"> Касније на овом курсу ћемо научити како да креирамо нелинеарне класификаторе користећи неуронске мреже, и како да се носимо са проблемом цифара које нису правилно поравнате. Врло брзо ћемо достићи тачност изнад 99% у класификацији цифара MNIST, док их класификујемо у 10 различитих класа.\n",
"\n",
"## Кључне поуке\n",
"## Закључак\n",
"\n",
" * Научили смо о најједноставнијој архитектури неуронске мреже - једнослојном перцептрону.\n",
" * Имплементирали смо перцептрон \"ручно\", користећи једноставну процедуру тренирања засновану на градијентском спуштању.\n",
" * Упркос својој једноставности, једнослојни перцептрон може решавати прилично сложене проблеме препознавања руком писаних цифара.\n",
" * Једнослојни перцептрон је линеарни класификатор, и стога пружа исту моћ класификације као и логистичка регресија.\n",
" * У узорковном простору, перцептрон може раздвојити две класе улазних података користећи хиперплан.\n"
" * Упркос једноставности, једнослојни перцептрон може решити прилично сложене проблеме препознавања руком писаних цифара.\n",
" * Једнослојни перцептрон је линеарни класификатор, и стога пружа исту моћ класификације као логистичка регресија.\n",
" * У узорном простору, перцептрон може раздвојити две класе улазних података користећи хиперплан.\n"
]
},
{
@ -1044,14 +1046,14 @@
"source": [
"## Захвалнице\n",
"\n",
"Овај нотебук је део [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners) и припремио га је [Дмитриј Сошњиков](http://soshnikov.com). Инспирисан је радионицом о неуронским мрежама у Microsoft Research Cambridge. Део кода и илустративних материјала преузет је из презентација [Катије Хофман](https://www.microsoft.com/en-us/research/people/kahofman/), [Метјуа Џонсона](https://www.microsoft.com/en-us/research/people/matjoh/) и [Рјота Томиоке](https://www.microsoft.com/en-us/research/people/ryoto/), као и из репозиторијума [NeuroWorkshop](http://github.com/shwars/NeuroWorkshop).\n"
"Овај нотебук је део [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners), и припремио га је [Дмитриј Сошњиков](http://soshnikov.com). Инспирисан је радионицом о неуронским мрежама у Microsoft Research Cambridge. Део кода и илустративних материјала преузет је из презентација [Катје Хофман](https://www.microsoft.com/en-us/research/people/kahofman/), [Метјуа Џонсона](https://www.microsoft.com/en-us/research/people/matjoh/) и [Рјота Томиоке](https://www.microsoft.com/en-us/research/people/ryoto/), као и из репозиторијума [NeuroWorkshop](http://github.com/shwars/NeuroWorkshop).\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Одрицање од одговорности**: \nОвај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако се трудимо да обезбедимо тачност, молимо вас да имате у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на његовом изворном језику треба сматрати меродавним извором. За критичне информације препоручује се професионални превод од стране људи. Не преузимамо одговорност за било каква погрешна тумачења или неспоразуме који могу настати услед коришћења овог превода.\n"
"\n---\n\n**Одрицање од одговорности**: \nОвај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако се трудимо да обезбедимо тачност, молимо вас да имате у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на изворном језику треба сматрати ауторитативним извором. За критичне информације препоручује се професионални превод од стране људи. Не сносимо одговорност за било каква погрешна тумачења или неспоразуме који могу произаћи из коришћења овог превода.\n"
]
}
],
@ -1080,8 +1082,8 @@
"start_slideshow_at": "selected"
},
"coopTranslator": {
"original_hash": "914fc55f59efc7e17b8130d4033ac617",
"translation_date": "2025-08-30T00:11:13+00:00",
"original_hash": "d67e5b54ba20b507aa88d71aa3d042d8",
"translation_date": "2025-10-03T13:45:13+00:00",
"source_file": "lessons/3-NeuralNetworks/03-Perceptron/Perceptron.ipynb",
"language_code": "sr"
}

View File

@ -11,7 +11,7 @@
"source": [
"## Perceptron\n",
"\n",
"> Denna anteckningsbok är en del av [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners). Besök repot för en komplett uppsättning läromaterial.\n",
"> Den här anteckningsboken är en del av [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners). Besök repot för att få hela uppsättningen av läromaterial.\n",
"\n",
"Som vi har diskuterat, gör perceptron det möjligt att lösa **binära klassificeringsproblem**, det vill säga att klassificera indataexempel i två klasser - vi kan kalla dem **positiva** och **negativa**.\n",
"\n",
@ -49,7 +49,7 @@
"source": [
"## Leksaksproblem\n",
"\n",
"Låt oss börja med ett leksaksproblem där vi har två indatafunktioner. Till exempel, inom medicin kanske vi vill klassificera tumörer som godartade eller elakartade, beroende på deras storlek och ålder.\n",
"Till att börja med, låt oss börja med ett leksaksproblem där vi har två indatafunktioner. Till exempel, inom medicin kanske vi vill klassificera tumörer som godartade eller elakartade, beroende på deras storlek och ålder.\n",
"\n",
"Vi kommer att generera ett slumpmässigt klassificeringsdataset med hjälp av funktionen `make_classification` från SciKit Learn-biblioteket:\n"
]
@ -154,11 +154,11 @@
"source": [
"## Perceptron\n",
"\n",
"Eftersom perceptron är en binär klassificerare, kommer utdata från vår perceptron för varje ingångsvektor $x$ att vara antingen +1 eller -1, beroende på klassen. Utdatan beräknas med formeln\n",
"Eftersom perceptron är en binär klassificerare, kommer utdata för varje inmatningsvektor $x$ från vår perceptron att vara antingen +1 eller -1, beroende på klass. Utdata beräknas med formeln\n",
"\n",
"$$y(\\mathbf{x}) = f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x})$$\n",
"\n",
"där $\\mathbf{w}$ är en viktvektor och $f$ är en stegaktiveringsfunktion:\n",
"där $\\mathbf{w}$ är en viktvektor och $f$ är en stegfunktion för aktivering:\n",
"$$\n",
"f(x) = \\begin{cases}\n",
" +1 & x \\geq 0 \\\\\n",
@ -166,7 +166,7 @@
" \\end{cases} \\\\\n",
"$$\n",
"\n",
"En generell linjär modell bör dock också ha en bias, det vill säga att vi idealt sett borde beräkna $y$ som $y=f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}+\\mathbf{b})$. För att förenkla vår modell kan vi eliminera denna bias-term genom att lägga till en extra dimension till våra ingångsvariabler, som alltid är lika med 1:\n"
"En generell linjär modell bör dock också ha en bias, dvs. idealiskt sett bör vi beräkna $y$ som $y=f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}+\\mathbf{b})$. För att förenkla vår modell kan vi eliminera denna bias-term genom att lägga till en extra dimension till våra inmatningsfunktioner, som alltid är lika med 1:\n"
]
},
{
@ -271,7 +271,9 @@
{
"cell_type": "markdown",
"metadata": {},
"source": []
"source": [
"Nu låt oss köra träningen på vår dataset:\n"
]
},
{
"cell_type": "code",
@ -311,7 +313,7 @@
"source": [
"Som du kan se är den initiala noggrannheten runt 50 %, men den ökar snabbt till högre värden nära 90 %.\n",
"\n",
"Låt oss visualisera hur klasserna separeras. Vår klassificeringsfunktion ser ut som $\\mathbf{w}^Tx$, och den är större än 0 för en klass och mindre än 0 för en annan. Alltså definieras klassens separationslinje av $\\mathbf{w}^Tx = 0$. Eftersom vi bara har två dimensioner $x_0$ och $x_1$, skulle ekvationen för linjen vara $w_0x_0+w_1x_1+w_2 = 0$ (kom ihåg att vi uttryckligen har definierat en extra dimension $x_2=1$). Låt oss plotta denna linje:\n"
"Låt oss visualisera hur klasserna separeras. Vår klassificeringsfunktion ser ut som $\\mathbf{w}^Tx$, och den är större än 0 för en klass och mindre än 0 för en annan. Därför definieras klassens separationslinje av $\\mathbf{w}^Tx = 0$. Eftersom vi bara har två dimensioner $x_0$ och $x_1$, skulle ekvationen för linjen vara $w_0x_0+w_1x_1+w_2 = 0$ (kom ihåg att vi uttryckligen har definierat en extra dimension $x_2=1$). Låt oss rita denna linje:\n"
]
},
{
@ -377,9 +379,9 @@
}
},
"source": [
"## Utvärdera på testdatamängd\n",
"## Utvärdera på testdatamängden\n",
"\n",
"I början har vi lagt undan en del data till testdatamängden. Låt oss se hur exakt vår klassificerare är på denna testdatamängd. För att göra detta utökar vi också testdatamängden med en extra dimension, multiplicerar med viktmatrisen och säkerställer att det erhållna värdet har samma tecken som etiketten (+1 eller -1). Därefter summerar vi alla booleska värden och dividerar med längden på testsamplet för att få fram noggrannheten:\n"
"I början har vi lagt undan en del data till testdatamängden. Låt oss se hur exakt vår klassificerare är på denna testdatamängd. För att göra detta utökar vi också testdatamängden med en extra dimension, multiplicerar med viktmatrisen och säkerställer att det erhållna värdet har samma tecken som etiketten (+1 eller -1). Därefter summerar vi alla booleska värden och delar med längden på testprovet för att få fram noggrannheten:\n"
]
},
{
@ -420,7 +422,7 @@
"source": [
"## Observera träningsprocessen\n",
"\n",
"Vi har tidigare sett hur noggrannheten minskar under träningen. Det skulle vara intressant att se hur separationslinjen beter sig under träningen. Koden nedan kommer att visualisera allt på en graf, och du ska kunna flytta reglaget för att \"resa i tiden\" genom träningsprocessen.\n"
"Vi har tidigare sett hur noggrannheten minskar under träningen. Det skulle vara intressant att se hur separationslinjen beter sig under träningen. Koden nedan kommer att visualisera allt på en enda graf, och du ska kunna flytta reglaget för att \"resa i tiden\" genom träningsprocessen.\n"
]
},
{
@ -527,16 +529,16 @@
"source": [
"## Begränsningar med Perceptron\n",
"\n",
"Som du har sett ovan är perceptron en **linjär klassificerare**. Den kan skilja mellan två klasser väl om de är **linjärt separerbara**, det vill säga om de kan separeras med en rak linje. Annars kommer träningsprocessen för perceptronen inte att konvergera.\n",
"Som du har sett ovan är perceptron en **linjär klassificerare**. Den kan skilja mellan två klasser väl om de är **linjärt separerbara**, dvs. kan separeras med en rak linje. Annars kommer träningsprocessen för perceptron inte att konvergera.\n",
"\n",
"Ett tydligt exempel på ett problem som inte kan lösas av en perceptron är det så kallade **XOR-problemet**. Vi vill att vår perceptron ska lära sig den booleska XOR-funktionen, som har följande sanningstabell:\n",
"Ett tydligt exempel på ett problem som inte kan lösas med en perceptron är det så kallade **XOR-problemet**. Vi vill att vår perceptron ska lära sig den booleska XOR-funktionen, som har följande sanningsvärdestabell:\n",
"\n",
"| | 0 | 1 |\n",
"|---|---|---|\n",
"| 0 | 0 | 1 | \n",
"| 1 | 1 | 0 |\n",
"\n",
"Låt oss försöka göra det! Vi kommer manuellt att fylla i alla positiva och negativa träningsprover och sedan anropa vår träningsfunktion som definierats ovan:\n"
"Låt oss försöka göra det! Vi kommer manuellt att fylla i alla positiva och negativa träningsprover och sedan kalla på vår träningsfunktion som definierats ovan:\n"
]
},
{
@ -603,7 +605,7 @@
}
},
"source": [
"Som du kan se från grafen ovan går noggrannheten aldrig över 75 %, eftersom det är omöjligt att dra en rak linje som korrekt täcker alla möjliga exempel.\n",
"Som du kan se från grafen ovan går noggrannheten aldrig över 75 %, eftersom det är omöjligt att dra en rak linje som korrekt klassificerar alla exempel.\n",
"\n",
"XOR-problemet är ett klassiskt exempel på perceptrons begränsningar, och det påpekades av Marvin Minsky och Seymour Papert 1969 i deras bok [Perceptrons](https://en.wikipedia.org/wiki/Perceptrons_(book)). Denna observation begränsade forskningen inom området för neurala nätverk i nästan 10 år, även om - och detta kommer vi att se i nästa avsnitt av vår kurs - flerskiktade perceptrons är fullt kapabla att lösa sådana problem.\n",
"\n",
@ -693,7 +695,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Eftersom perceptron är en binär klassificerare, kommer vi att begränsa vårt problem till att känna igen endast två siffror. Funktionen nedan kommer att fylla positiva och negativa provarrayer med två givna siffror (och kommer också att visa prover av dessa siffror för tydlighet).\n"
"Eftersom perceptron är en binär klassificerare kommer vi att begränsa vårt problem till att känna igen endast två siffror. Funktionen nedan kommer att fylla positiva och negativa provarrayer med två givna siffror (och kommer också att visa prover av dessa siffror för tydlighet).\n"
]
},
{
@ -829,13 +831,13 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Observera hur noggrannheten ökar till nästan 100% väldigt snabbt.\n",
"Observera hur noggrannheten snabbt når nästan 100%.\n",
"\n",
"Flytta reglaget till en position mot slutet av träningen och observera viktmatrisen som plottas till vänster. Denna matris hjälper dig att förstå hur perceptronen faktiskt fungerar. Du kan se höga viktvärden i mitten av fältet, vilket motsvarar pixlar som vanligtvis finns för siffran 1, och låga negativa värden vid sidorna, där delar av siffran 0 finns. Så, om siffran som presenteras för perceptronen faktiskt är 1, kommer mitten av den att multipliceras med höga värden, vilket ger ett positivt resultat. Däremot, när perceptronen observerar siffran 0, kommer motsvarande pixlar att multipliceras med negativa tal.\n",
"Flytta reglaget till en position mot slutet av träningen och titta på viktmatrisen som visas till vänster. Denna matris hjälper dig att förstå hur en perceptron faktiskt fungerar. Du kan se höga viktvärden i mitten av fältet, som motsvarar pixlar som vanligtvis finns för siffran 1, och låga negativa värden på sidorna, där delar av siffran 0 finns. Så om siffran som presenteras för perceptronen faktiskt är 1, kommer mitten av den att multipliceras med höga värden, vilket ger ett positivt resultat. Däremot, när perceptronen observerar siffran 0, kommer motsvarande pixlar att multipliceras med negativa tal.\n",
"\n",
"> Du kanske märker att om vi ger vår perceptron en siffra 1 som är något förskjuten horisontellt, så att dess pixlar upptar platsen där det finns vertikala delar av siffran 0, kan vi få ett felaktigt resultat. Eftersom MNIST-datasetets natur är sådan att alla siffror är centrerade och korrekt positionerade, förlitar sig perceptronen på detta för att skilja mellan siffrorna.\n",
"> Du kanske märker att om vi ger vår perceptron en siffra 1 som är något förskjuten horisontellt, så att dess pixlar hamnar där de vertikala delarna av siffran 0 finns, kan vi få ett felaktigt resultat. Detta beror på att MNIST-datasetet är utformat så att alla siffror är centrerade och korrekt positionerade, och perceptronen förlitar sig på detta för att skilja mellan siffrorna.\n",
"\n",
"Nu ska vi testa olika siffror:\n"
"Nu ska vi prova med olika siffror: \n"
]
},
{
@ -915,7 +917,7 @@
"\n",
"För att förstå varför detta händer kan vi försöka använda [Principal Component Analysis](https://en.wikipedia.org/wiki/Principal_component_analysis) (PCA). Det är en maskininlärningsteknik som används för att minska dimensionerna i inmatningsdatasetet, på ett sätt som ger bästa möjliga separabilitet mellan klasser.\n",
"\n",
"I vårt fall har en inmatningsbild 784 pixlar (inmatningsfunktioner), och vi vill använda PCA för att minska antalet parametrar till bara 2, så att vi kan plotta dem på en graf. Dessa två parametrar skulle vara en linjärkombination av de ursprungliga funktionerna, och vi kan se denna procedur som att \"rotera\" vårt ursprungliga 784-dimensionella utrymme och observera dess projektion till vårt 2D-utrymme, tills vi får den bästa vyn som separerar klasserna.\n"
"I vårt fall har en inmatningsbild 784 pixlar (inmatningsfunktioner), och vi vill använda PCA för att minska antalet parametrar till bara 2, så att vi kan plotta dem på en graf. Dessa två parametrar skulle vara en linjär kombination av de ursprungliga funktionerna, och vi kan se denna procedur som att \"rotera\" vårt ursprungliga 784-dimensionella utrymme och observera dess projektion till vårt 2D-utrymme, tills vi får den bästa vyn som separerar klasserna.\n"
]
},
{
@ -1025,17 +1027,17 @@
}
},
"source": [
"Som du kan se, kan 0 och 1 tydligt separeras med en rak linje. Detta indikerar att i det ursprungliga 784-dimensionella rummet är punkterna som motsvarar siffrorna också linjärt separerbara. När det gäller 2 och 5 kan vi inte hitta en bra projektion som tydligt separerar siffrorna, och därför finns det vissa fall av felklassificering.\n",
"Som du kan se kan 0 och 1 tydligt separeras med en rak linje. Detta indikerar att i det ursprungliga 784-dimensionella rummet är punkterna som motsvarar siffrorna också linjärt separerbara. När det gäller 2 och 5 kan vi inte hitta en bra projektion som tydligt separerar siffrorna, och därför finns det vissa fall av felaktig klassificering.\n",
"\n",
"> Senare i den här kursen kommer vi att lära oss hur man skapar icke-linjära klassificerare med hjälp av neurala nätverk, och hur man hanterar problemet med siffror som inte är korrekt justerade. Mycket snart kommer vi att nå över 99 % noggrannhet i klassificeringen av MNIST-siffror, samtidigt som vi klassificerar dem i 10 olika klasser.\n",
"> Senare i den här kursen kommer vi att lära oss hur man skapar icke-linjära klassificerare med hjälp av neurala nätverk, och hur man hanterar problemet med siffror som inte är korrekt justerade. Mycket snart kommer vi att nå över 99 % noggrannhet i MNIST-sifferklassificering, samtidigt som vi klassificerar dem i 10 olika klasser.\n",
"\n",
"## Slutsatser\n",
"\n",
" * Vi har lärt oss om den enklaste neurala nätverksarkitekturen - enlagers perceptron.\n",
" * Vi har implementerat perceptronen \"för hand\", med hjälp av en enkel träningsprocedur baserad på gradientnedstigning.\n",
" * Trots sin enkelhet kan enlagers perceptron lösa ganska komplexa problem med igenkänning av handskrivna siffror.\n",
" * Enlagers perceptron är en linjär klassificerare och ger därför samma klassificeringsförmåga som logistisk regression.\n",
" * I det sampelutrymmet kan perceptronen separera två klasser av indata med hjälp av ett hyperplan.\n"
" * Vi har implementerat perceptron \"för hand\", med hjälp av en enkel träningsprocedur baserad på gradientnedstigning.\n",
" * Trots sin enkelhet kan enlagers perceptron lösa ganska komplexa problem med handskriven sifferigenkänning.\n",
" * Enlagers perceptron är en linjär klassificerare och erbjuder därför samma klassificeringsförmåga som logistisk regression.\n",
" * I det ursprungliga rummet kan perceptron separera två klasser av indata med hjälp av ett hyperplan.\n"
]
},
{
@ -1044,14 +1046,14 @@
"source": [
"## Krediter\n",
"\n",
"Denna anteckningsbok är en del av [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners) och har förberetts av [Dmitry Soshnikov](http://soshnikov.com). Den är inspirerad av Neural Network Workshop vid Microsoft Research Cambridge. Viss kod och illustrativa material är hämtade från presentationer av [Katja Hoffmann](https://www.microsoft.com/en-us/research/people/kahofman/), [Matthew Johnson](https://www.microsoft.com/en-us/research/people/matjoh/) och [Ryoto Tomioka](https://www.microsoft.com/en-us/research/people/ryoto/), samt från [NeuroWorkshop](http://github.com/shwars/NeuroWorkshop)-arkivet.\n"
"Denna notebook är en del av [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners) och har förberetts av [Dmitry Soshnikov](http://soshnikov.com). Den är inspirerad av Neural Network Workshop vid Microsoft Research Cambridge. Viss kod och illustrativa material är hämtade från presentationer av [Katja Hoffmann](https://www.microsoft.com/en-us/research/people/kahofman/), [Matthew Johnson](https://www.microsoft.com/en-us/research/people/matjoh/) och [Ryoto Tomioka](https://www.microsoft.com/en-us/research/people/ryoto/), samt från [NeuroWorkshop](http://github.com/shwars/NeuroWorkshop)-arkivet.\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Ansvarsfriskrivning**: \nDetta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, vänligen notera att automatiska översättningar kan innehålla fel eller felaktigheter. Det ursprungliga dokumentet på dess originalspråk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning.\n"
"\n---\n\n**Ansvarsfriskrivning**: \nDetta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, bör det noteras att automatiska översättningar kan innehålla fel eller felaktigheter. Det ursprungliga dokumentet på dess originalspråk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning.\n"
]
}
],
@ -1080,8 +1082,8 @@
"start_slideshow_at": "selected"
},
"coopTranslator": {
"original_hash": "914fc55f59efc7e17b8130d4033ac617",
"translation_date": "2025-08-29T08:27:53+00:00",
"original_hash": "d67e5b54ba20b507aa88d71aa3d042d8",
"translation_date": "2025-10-03T13:29:29+00:00",
"source_file": "lessons/3-NeuralNetworks/03-Perceptron/Perceptron.ipynb",
"language_code": "sv"
}

View File

@ -11,7 +11,7 @@
"source": [
"## Perceptron\n",
"\n",
"> Daftari hili ni sehemu ya [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners). Tembelea hifadhi kwa seti kamili ya vifaa vya kujifunzia.\n",
"> Daftari hii ni sehemu ya [Mtaala wa AI kwa Kompyuta](http://github.com/microsoft/ai-for-beginners). Tembelea hifadhi kwa seti kamili ya vifaa vya kujifunzia.\n",
"\n",
"Kama tulivyojadili, perceptron inakuruhusu kutatua **tatizo la uainishaji wa binary**, yaani kuainisha mifano ya pembejeo katika madarasa mawili - tunaweza kuyaita **chanya** na **hasi**.\n",
"\n",
@ -49,7 +49,7 @@
"source": [
"## Tatizo la Msingi\n",
"\n",
"Kuanza, hebu tuanze na tatizo rahisi, ambapo tuna vipengele viwili vya kuingiza. Kwa mfano, katika tiba tunaweza kutaka kuainisha uvimbe kuwa wa kawaida au hatari, kulingana na ukubwa wake na umri.\n",
"Kuanza, hebu tuanze na tatizo la msingi, ambapo tuna vipengele viwili vya ingizo. Kwa mfano, katika tiba tunaweza kutaka kuainisha uvimbe kuwa wa kawaida au hatari, kulingana na ukubwa wake na umri.\n",
"\n",
"Tutazalisha seti ya data ya uainishaji wa nasibu kwa kutumia kazi ya `make_classification` kutoka maktaba ya SciKit Learn:\n"
]
@ -95,7 +95,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Hebu pia tuweke dataset:\n"
"Hebu pia tuchore seti ya data:\n"
]
},
{
@ -154,7 +154,7 @@
"source": [
"## Perceptron\n",
"\n",
"Kwa kuwa perceptron ni kiondoa daraja mbili, kwa kila vector ya ingizo $x$ matokeo ya perceptron yetu yatakuwa aidha +1 au -1, kulingana na daraja. Matokeo yatakokotolewa kwa kutumia fomula\n",
"Kwa kuwa perceptron ni kiondoa daraja cha binary, kwa kila vector ya pembejeo $x$, matokeo ya perceptron yetu yatakuwa aidha +1 au -1, kulingana na daraja. Matokeo yatakokotolewa kwa kutumia fomula\n",
"\n",
"$$y(\\mathbf{x}) = f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x})$$\n",
"\n",
@ -166,7 +166,7 @@
" \\end{cases} \\\\\n",
"$$\n",
"\n",
"Hata hivyo, mfano wa kawaida wa mstari unapaswa pia kuwa na upendeleo, yaani, kwa hali bora tunapaswa kukokotoa $y$ kama $y=f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}+\\mathbf{b})$. Ili kurahisisha mfano wetu, tunaweza kuondoa kipengele cha upendeleo kwa kuongeza kipimo kingine kwenye sifa zetu za ingizo, ambacho daima ni sawa na 1:\n"
"Hata hivyo, mfano wa mstari wa kawaida unapaswa pia kuwa na upendeleo, yaani, kwa hali bora tunapaswa kukokotoa $y$ kama $y=f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}+\\mathbf{b})$. Ili kurahisisha mfano wetu, tunaweza kuondoa kipengele cha upendeleo kwa kuongeza kipimo kingine kwenye sifa zetu za pembejeo, ambacho daima ni sawa na 1:\n"
]
},
{
@ -206,20 +206,20 @@
"source": [
"## Algorithimu ya Mafunzo\n",
"\n",
"Ili kufundisha perceptron, tunahitaji kupata uzito $\\mathbf{w}$ ambao utapunguza makosa. Makosa yanaelezwa kwa kutumia **vigezo vya perceptron**:\n",
"Ili kufundisha perceptron, tunahitaji kupata uzito $\\mathbf{w}$ ambao utapunguza makosa. Makosa yanafafanuliwa kwa kutumia **vigezo vya perceptron**:\n",
"\n",
"$$E(\\mathbf{w}) = -\\sum_{n \\in \\mathcal{M}}\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}_{n}t_{n}$$\n",
" \n",
" * $t_{n} \\in \\{-1, +1\\}$ kwa sampuli za mafunzo hasi na chanya, mtawalia\n",
" * $\\mathcal{M}$ - seti ya mifano iliyokosewa kutambuliwa\n",
" * $t_{n} \\in \\{-1, +1\\}$ kwa sampuli hasi na chanya za mafunzo, mtawalia\n",
" * $\\mathcal{M}$ - seti ya mifano iliyokosewa kuainishwa\n",
" \n",
"Tutatumia mchakato wa **gradient descent**. Tukianza na uzito wa awali wa bahati nasibu $\\mathbf{w}^{(0)}$, tutarekebisha uzito katika kila hatua ya mafunzo kwa kutumia gradient ya $E$:\n",
"Tutatumia mchakato wa **gradient descent**. Tukianza na uzito wa awali wa nasibu $\\mathbf{w}^{(0)}$, tutarekebisha uzito katika kila hatua ya mafunzo kwa kutumia gradient ya $E$:\n",
"\n",
"$$\\mathbf{w}^{\\tau + 1}=\\mathbf{w}^{\\tau} - \\eta \\nabla E(\\mathbf{w}) = \\mathbf{w}^{\\tau} + \\eta\\sum_{n \\in \\mathcal{M}}\\mathbf{x}_{n} t_{n}$$\n",
"\n",
"ambapo $\\eta$ ni **kiwango cha kujifunza**, na $\\tau\\in\\mathbb{N}$ - idadi ya marudio.\n",
"\n",
"Hebu tueleze algorithimu hii kwa Python:\n"
"Hebu tueleze algorithimu hii kwa kutumia Python:\n"
]
},
{
@ -271,7 +271,9 @@
{
"cell_type": "markdown",
"metadata": {},
"source": []
"source": [
"Sasa tuendeshe mafunzo kwenye seti yetu ya data:\n"
]
},
{
"cell_type": "code",
@ -309,9 +311,9 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Kama unavyoona, usahihi wa awali ni karibu asilimia 50%, lakini huongezeka haraka hadi viwango vya juu karibu na asilimia 90%.\n",
"Kama unavyoona, usahihi wa awali ni karibu 50%, lakini unakua haraka hadi thamani za juu karibu na 90%.\n",
"\n",
"Hebu tuone jinsi madarasa yanavyotenganishwa. Kazi yetu ya uainishaji inaonekana kama $\\mathbf{w}^Tx$, na ni kubwa kuliko 0 kwa darasa moja, na iko chini ya 0 kwa darasa lingine. Kwa hivyo, mstari wa kutenganisha madarasa unafafanuliwa na $\\mathbf{w}^Tx = 0$. Kwa kuwa tuna vipimo viwili tu $x_0$ na $x_1$, mlinganyo wa mstari ungekuwa $w_0x_0+w_1x_1+w_2 = 0$ (kumbuka kwamba tumeweka wazi kipimo cha ziada $x_2=1$). Hebu tuweke mstari huu kwenye mchoro:\n"
"Hebu tuone jinsi madarasa yanavyotenganishwa. Kazi yetu ya uainishaji inaonekana kama $\\mathbf{w}^Tx$, na ni kubwa kuliko 0 kwa darasa moja, na iko chini ya 0 kwa lingine. Kwa hivyo, mstari wa kutenganisha madarasa unafafanuliwa na $\\mathbf{w}^Tx = 0$. Kwa kuwa tuna vipimo viwili tu $x_0$ na $x_1$, mlinganyo wa mstari ungekuwa $w_0x_0+w_1x_1+w_2 = 0$ (kumbuka kwamba tumeweka wazi kipimo cha ziada $x_2=1$). Hebu tupake mstari huu:\n"
]
},
{
@ -377,9 +379,9 @@
}
},
"source": [
"## Tathmini kwenye Seti ya Data ya Majaribio\n",
"## Tathmini kwenye Dataset ya Majaribio\n",
"\n",
"Hapo mwanzo, tulitenga baadhi ya data kwa ajili ya seti ya data ya majaribio. Hebu tuone jinsi mklasifaya wetu ulivyo sahihi kwenye seti hii ya majaribio. Ili kufanya hivyo, tunaongeza pia kipimo cha ziada kwenye seti ya data ya majaribio, kuzidisha na matriki ya uzito, na kuhakikisha kwamba thamani inayopatikana ina alama sawa na lebo (+1 au -1). Kisha tunajumlisha thamani zote za boolean na kugawanya kwa urefu wa sampuli ya majaribio, ili kupata usahihi:\n"
"Mwanzoni, tulitenga baadhi ya data kwa ajili ya dataset ya majaribio. Hebu tuone jinsi classifier yetu ilivyo sahihi kwenye dataset hii ya majaribio. Ili kufanya hivyo, tunapanua dataset ya majaribio kwa kuongeza kipimo cha ziada, tunazidisha na matrix ya uzito, na kuhakikisha kwamba thamani iliyopatikana ina alama sawa na lebo (+1 au -1). Kisha tunajumlisha thamani zote za boolean na kugawanya kwa urefu wa sampuli ya majaribio, ili kupata usahihi:\n"
]
},
{
@ -420,7 +422,7 @@
"source": [
"## Kuchunguza mchakato wa mafunzo\n",
"\n",
"Tumeona hapo awali jinsi usahihi unavyopungua wakati wa mafunzo. Ingependeza kuona jinsi mstari wa mgawanyiko unavyobadilika wakati wa mafunzo. Msimbo hapa chini utaonyesha kila kitu kwenye grafu moja, na unapaswa kuwa na uwezo wa kusogeza kitelezi ili \"kusafiri kupitia muda\" katika mchakato wa mafunzo.\n"
"Tumeona hapo awali jinsi usahihi unavyopungua wakati wa mafunzo. Ingekuwa vizuri kuona jinsi mstari wa mgawanyiko unavyobadilika wakati wa mafunzo. Nambari iliyo hapa chini itaonyesha kila kitu kwenye grafu moja, na unapaswa kuwa na uwezo wa kusogeza kitelezi ili \"kusafiri kwa wakati\" kupitia mchakato wa mafunzo.\n"
]
},
{
@ -529,14 +531,14 @@
"\n",
"Kama ulivyoona hapo juu, perceptron ni **kainishaji wa mstari**. Inaweza kutofautisha kati ya madarasa mawili vizuri ikiwa madarasa hayo ni **yanayoweza kutenganishwa kwa mstari**, yaani yanaweza kutenganishwa kwa mstari wa moja kwa moja. Vinginevyo, mchakato wa mafunzo ya perceptron hautafikia hitimisho.\n",
"\n",
"Mfano wa wazi zaidi wa tatizo ambalo haliwezi kutatuliwa na perceptron ni tatizo linalojulikana kama **tatizo la XOR**. Tunataka perceptron yetu ijifunze kazi ya mantiki ya XOR, ambayo ina jedwali la ukweli lifuatalo:\n",
"Mfano wa wazi kabisa wa tatizo ambalo haliwezi kutatuliwa na perceptron ni tatizo linalojulikana kama **tatizo la XOR**. Tunataka perceptron yetu ijifunze kazi ya mantiki ya XOR, ambayo ina jedwali la ukweli lifuatalo:\n",
"\n",
"| | 0 | 1 |\n",
"|---|---|---|\n",
"| 0 | 0 | 1 | \n",
"| 1 | 1 | 0 |\n",
"\n",
"Hebu tujaribu kufanya hivyo! Tutajaza kwa mkono sampuli zote za mafunzo chanya na hasi, kisha tuitishe kazi yetu ya mafunzo iliyofafanuliwa hapo juu:\n"
"Hebu tujaribu kufanya hivyo! Tutajaza kwa mkono sampuli zote za mafunzo chanya na hasi, kisha tuitishe kazi yetu ya mafunzo tuliyofafanua hapo juu:\n"
]
},
{
@ -603,19 +605,19 @@
}
},
"source": [
"Kama unavyoona kutoka kwenye grafu hapo juu, usahihi hauzidi asilimia 75%, kwa sababu haiwezekani kuchora mstari wa moja kwa moja kwa njia ambayo mifano yote iwe sahihi.\n",
"Kama unavyoona kutoka kwenye grafu hapo juu, usahihi hauzidi asilimia 75%, kwa sababu haiwezekani kuchora mstari wa moja kwa moja kwa namna ya kupata mifano yote kwa usahihi.\n",
"\n",
"Tatizo la XOR ni mfano wa kawaida wa mipaka ya perceptron, na lilionyeshwa na Marvin Minsky na Seymour Papert mwaka 1969 katika kitabu chao [Perceptrons](https://en.wikipedia.org/wiki/Perceptrons_(book)). Uangalizi huu ulizuia utafiti katika eneo la mitandao ya neva kwa karibu miaka 10, ingawa - na tutaona hili katika sehemu inayofuata ya kozi yetu - perceptrons zenye tabaka nyingi zina uwezo wa kutatua matatizo kama haya.\n",
"\n",
"## Mfano Mgumu - MNIST\n",
"\n",
"Ingawa perceptron haiwezi kutatua tatizo la XOR, inaweza kutatua matatizo mengine magumu zaidi, kama vile utambuzi wa maandishi ya mkono.\n",
"Ingawa perceptron haiwezi kutatua tatizo la XOR, inaweza kutatua matatizo mengi magumu zaidi, kama vile utambuzi wa herufi zilizoandikwa kwa mkono.\n",
"\n",
"Seti ya data ambayo mara nyingi hutumika wakati wa kujifunza mashine inaitwa [MNIST](https://en.wikipedia.org/wiki/MNIST_database). Iliundwa na Taasisi ya Kitaifa ya Viwango na Teknolojia Iliyorekebishwa, na ina seti ya mafunzo ya tarakimu 60000 zilizoandikwa kwa mkono, zilizokusanywa kutoka kwa takriban wanafunzi na wafanyakazi 250 wa taasisi hiyo. Pia kuna seti ya majaribio ya tarakimu 10000, zilizokusanywa kutoka kwa watu tofauti.\n",
"Seti ya data ambayo mara nyingi hutumiwa wakati wa kujifunza mashine inaitwa [MNIST](https://en.wikipedia.org/wiki/MNIST_database). Imeundwa na Taasisi ya Kitaifa ya Viwango na Teknolojia Iliyorekebishwa, na ina seti ya mafunzo ya tarakimu 60,000 zilizoandikwa kwa mkono, zilizokusanywa kutoka kwa takriban wanafunzi 250 na wafanyakazi wa taasisi hiyo. Pia kuna seti ya majaribio ya tarakimu 10,000, zilizokusanywa kutoka kwa watu tofauti.\n",
"\n",
"Tarakimu zote zinawakilishwa na picha za rangi ya kijivu zenye ukubwa wa pikseli 28x28.\n",
"\n",
"> Seti ya Data ya MNIST inapatikana kama shindano la mafunzo kwenye [Kaggle](https://www.kaggle.com/c/digit-recognizer), tovuti inayoshikilia mashindano na mashindano ya kujifunza mashine. Mara tu unapojifunza jinsi ya kuainisha tarakimu za MNIST, unaweza kuwasilisha suluhisho lako kwa Kaggle ili kuona jinsi linavyokadiriwa miongoni mwa washiriki wengine.\n",
"> Seti ya data ya MNIST inapatikana kama shindano la mafunzo kwenye [Kaggle](https://www.kaggle.com/c/digit-recognizer), tovuti inayoshirikisha mashindano na michuano ya kujifunza mashine. Mara tu unapojifunza jinsi ya kuainisha tarakimu za MNIST, unaweza kuwasilisha suluhisho lako kwa Kaggle ili kuona jinsi linavyokadiriwa miongoni mwa washiriki wengine.\n",
"\n",
"Tunaanza kwa kupakia seti ya data ya MNIST:\n"
]
@ -642,7 +644,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Sasa wacha tuchore seti ya data:\n"
"Sasa hebu tuchore seti ya data:\n"
]
},
{
@ -693,7 +695,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Kwa sababu perceptron ni kiondoa-bainishi, tutapunguza tatizo letu kwa kutambua tarakimu mbili tu. Kazi iliyo hapa chini itaweka safu za sampuli chanya na hasi na tarakimu mbili zilizotolewa (na pia itaonyesha sampuli za tarakimu hizo kwa uwazi).\n"
"Kwa sababu perceptron ni classifier ya binary, tutapunguza tatizo letu kwa kutambua tarakimu mbili tu. Kazi iliyo hapa chini itaweka safu za sampuli chanya na hasi na tarakimu mbili zilizotolewa (na pia itaonyesha sampuli za tarakimu hizo kwa uwazi).\n"
]
},
{
@ -732,7 +734,9 @@
{
"cell_type": "markdown",
"metadata": {},
"source": []
"source": [
"Tutaanza kwa kujaribu kuainisha kati ya 0 na 1:\n"
]
},
{
"cell_type": "code",
@ -827,11 +831,11 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Tafadhali angalia jinsi usahihi unavyoongezeka haraka hadi karibu asilimia 100.\n",
"Tafadhali kumbuka jinsi usahihi unavyopanda hadi karibu 100% kwa haraka sana.\n",
"\n",
"Tafadhali, songesha kitelezi hadi sehemu fulani kuelekea mwisho wa mafunzo, na angalia matriki ya uzani iliyochorwa upande wa kushoto. Matriki hii itakuruhusu kuelewa jinsi perceptron inavyofanya kazi. Unaweza kuona thamani za juu za uzani katikati ya uwanja, ambazo zinahusiana na pikseli ambazo mara nyingi zinapatikana kwa tarakimu 1, na thamani za chini hasi pembeni, ambapo sehemu za tarakimu 0 zipo. Kwa hivyo, ikiwa tarakimu iliyowasilishwa kwa perceptron ni kweli 1, sehemu ya katikati yake itazidishwa na thamani za juu, ikitoa matokeo chanya. Kinyume chake, wakati perceptron inapoona 0, pikseli zinazohusiana zitazidishwa na nambari hasi.\n",
"Tafadhali, songesha kitelezi hadi sehemu fulani karibu na mwisho wa mafunzo, na angalia matriki ya uzito iliyochorwa upande wa kushoto. Matriki hii itakusaidia kuelewa jinsi perceptron inavyofanya kazi. Unaweza kuona thamani za juu za uzito katikati ya uwanja, ambazo zinahusiana na pikseli ambazo mara nyingi zinapatikana kwa tarakimu 1, na thamani za chini hasi pembeni, ambapo sehemu za tarakimu 0 zipo. Kwa hivyo, ikiwa tarakimu iliyowasilishwa kwa perceptron ni kweli 1, sehemu ya katikati yake itazidishwa na thamani za juu, ikizalisha matokeo chanya. Kinyume chake, wakati perceptron inapoona 0, pikseli zinazohusiana zitazidishwa na namba hasi.\n",
"\n",
"> Unaweza kugundua kwamba tukimpa perceptron tarakimu 1 iliyosogezwa kidogo kwa usawa, ili pikseli zake zichukue nafasi ambapo kuna sehemu za wima za 0, tunaweza kupata matokeo yasiyo sahihi. Kwa kuwa asili ya seti yetu ya data ya MNIST ni kwamba tarakimu zote ziko katikati na zimewekwa vizuri, na perceptron inategemea hili kutofautisha kati ya tarakimu.\n",
"> Unaweza kugundua kwamba tukimpa perceptron tarakimu 1 iliyosogezwa kidogo kwa usawa, ili pikseli zake zichukue nafasi ambapo kuna sehemu za wima za 0, tunaweza kupata matokeo yasiyo sahihi. Kwa kuwa asili ya seti yetu ya data ya MNIST ni kwamba tarakimu zote ziko katikati na zimewekwa vizuri, perceptron inategemea hili kutofautisha kati ya tarakimu.\n",
"\n",
"Sasa hebu tujaribu tarakimu tofauti:\n"
]
@ -911,7 +915,7 @@
"\n",
"Kwa sababu fulani, 2 na 5 hazitenganishwi kwa urahisi. Ingawa tunapata usahihi wa juu (zaidi ya 85%), tunaweza kuona wazi jinsi perceptron inavyokoma kujifunza katika hatua fulani.\n",
"\n",
"Ili kuelewa kwa nini hili linatokea, tunaweza kujaribu kutumia [Principal Component Analysis](https://en.wikipedia.org/wiki/Principal_component_analysis) (PCA). Hii ni mbinu ya kujifunza kwa mashine inayotumika kupunguza ukubwa wa dataset ya pembejeo, kwa namna ya kupata utenganisho bora kati ya madarasa.\n",
"Ili kuelewa kwa nini hili linatokea, tunaweza kujaribu kutumia [Principal Component Analysis](https://en.wikipedia.org/wiki/Principal_component_analysis) (PCA). Hii ni mbinu ya kujifunza kwa mashine inayotumika kupunguza ukubwa wa dataset ya pembejeo, kwa namna ambayo inapatikana utenganisho bora kati ya madarasa.\n",
"\n",
"Katika hali yetu, picha ya pembejeo ina pikseli 784 (vipengele vya pembejeo), na tunataka kutumia PCA kupunguza idadi ya vigezo hadi 2 tu, ili tuweze kuviweka kwenye grafu. Vigezo hivyo viwili vitakuwa mchanganyiko wa mstari wa vipengele asilia, na tunaweza kuona mchakato huu kama \"kuzungusha\" nafasi yetu ya vipengele 784 na kuangalia makadirio yake kwenye nafasi ya 2D, hadi tupate mtazamo bora unaotenganisha madarasa.\n"
]
@ -1023,11 +1027,11 @@
}
},
"source": [
"Kama unavyoona, 0 na 1 vinaweza kutenganishwa wazi na mstari ulionyooka. Hii inaonyesha kwamba katika nafasi ya asili yenye vipimo 784, nukta zinazowakilisha tarakimu pia zinaweza kutenganishwa kwa mstari. Katika hali ya 2 na 5, hatuwezi kupata makadirio mazuri yatakayoweza kutenganisha tarakimu kwa uwazi, na hivyo kuna baadhi ya matukio ya uainishaji usio sahihi.\n",
"Kama unavyoona, 0 na 1 zinaweza kutenganishwa wazi na mstari wa moja kwa moja. Hii inaonyesha kwamba katika nafasi ya asili yenye vipimo 784, nukta zinazowakilisha tarakimu pia zinaweza kutenganishwa kwa mstari. Katika hali ya 2 na 5, hatuwezi kupata makadirio mazuri yatakayozitenganisha tarakimu kwa uwazi, na hivyo kuna baadhi ya matukio ya uainishaji usio sahihi.\n",
"\n",
"> Baadaye katika kozi hii tutajifunza jinsi ya kuunda uainishaji usio wa mstari kwa kutumia Mitandao ya Neva, na jinsi ya kushughulikia tatizo la tarakimu kutokuwa zimepangwa vizuri. Hivi karibuni tutafikia usahihi wa zaidi ya 99% katika uainishaji wa tarakimu za MNIST, huku tukizigawa katika madarasa 10 tofauti.\n",
"\n",
"## Mambo Muhimu\n",
"## Mambo ya Kujifunza\n",
"\n",
" * Tumeelewa kuhusu usanifu rahisi zaidi wa mtandao wa neva - perceptron ya tabaka moja.\n",
" * Tumetekeleza perceptron \"kwa mkono\", kwa kutumia utaratibu rahisi wa mafunzo unaotegemea gradient descent.\n",
@ -1042,14 +1046,14 @@
"source": [
"## Shukrani\n",
"\n",
"Daftari hili ni sehemu ya [Mtaala wa AI kwa Kompyuta](http://github.com/microsoft/ai-for-beginners), na limeandaliwa na [Dmitry Soshnikov](http://soshnikov.com). Limechangiwa na Warsha ya Mtandao wa Neva katika Microsoft Research Cambridge. Baadhi ya msimbo na vifaa vya kuonyesha vimechukuliwa kutoka kwenye mawasilisho ya [Katja Hoffmann](https://www.microsoft.com/en-us/research/people/kahofman/), [Matthew Johnson](https://www.microsoft.com/en-us/research/people/matjoh/) na [Ryoto Tomioka](https://www.microsoft.com/en-us/research/people/ryoto/), pamoja na hifadhi ya [NeuroWorkshop](http://github.com/shwars/NeuroWorkshop).\n"
"Notebook hii ni sehemu ya [Mtaala wa AI kwa Kompyuta](http://github.com/microsoft/ai-for-beginners), na imeandaliwa na [Dmitry Soshnikov](http://soshnikov.com). Imechochewa na Warsha ya Mtandao wa Neva katika Microsoft Research Cambridge. Baadhi ya msimbo na vifaa vya maonyesho vimechukuliwa kutoka kwa mawasilisho ya [Katja Hoffmann](https://www.microsoft.com/en-us/research/people/kahofman/), [Matthew Johnson](https://www.microsoft.com/en-us/research/people/matjoh/) na [Ryoto Tomioka](https://www.microsoft.com/en-us/research/people/ryoto/), pamoja na hifadhi ya [NeuroWorkshop](http://github.com/shwars/NeuroWorkshop).\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Kanusho**: \nHati hii imetafsiriwa kwa kutumia huduma ya tafsiri ya AI [Co-op Translator](https://github.com/Azure/co-op-translator). Ingawa tunajitahidi kwa usahihi, tafadhali fahamu kuwa tafsiri za kiotomatiki zinaweza kuwa na makosa au kutokuwa sahihi. Hati ya asili katika lugha yake ya awali inapaswa kuzingatiwa kama chanzo cha mamlaka. Kwa taarifa muhimu, inashauriwa kutumia tafsiri ya kitaalamu ya binadamu. Hatutawajibika kwa maelewano mabaya au tafsiri zisizo sahihi zinazotokana na matumizi ya tafsiri hii.\n"
"\n---\n\n**Kanusho**: \nHati hii imetafsiriwa kwa kutumia huduma ya tafsiri ya AI [Co-op Translator](https://github.com/Azure/co-op-translator). Ingawa tunajitahidi kwa usahihi, tafadhali fahamu kuwa tafsiri za kiotomatiki zinaweza kuwa na makosa au kutokuwa sahihi. Hati ya asili katika lugha yake ya awali inapaswa kuzingatiwa kama chanzo cha mamlaka. Kwa taarifa muhimu, inashauriwa kutumia huduma ya tafsiri ya kibinadamu ya kitaalamu. Hatutawajibika kwa kutoelewana au tafsiri zisizo sahihi zinazotokana na matumizi ya tafsiri hii.\n"
]
}
],
@ -1078,8 +1082,8 @@
"start_slideshow_at": "selected"
},
"coopTranslator": {
"original_hash": "914fc55f59efc7e17b8130d4033ac617",
"translation_date": "2025-08-29T15:01:05+00:00",
"original_hash": "d67e5b54ba20b507aa88d71aa3d042d8",
"translation_date": "2025-10-03T13:38:56+00:00",
"source_file": "lessons/3-NeuralNetworks/03-Perceptron/Perceptron.ipynb",
"language_code": "sw"
}

View File

@ -11,11 +11,11 @@
"source": [
"## เพอร์เซปตรอน\n",
"\n",
"> โน้ตบุ๊กนี้เป็นส่วนหนึ่งของ [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners) เยี่ยมชมที่เก็บข้อมูลเพื่อดูชุดเอกสารการเรียนรู้ทั้งหมด\n",
"> โน้ตบุ๊กนี้เป็นส่วนหนึ่งของ [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners) เยี่ยมชมที่เก็บข้อมูลเพื่อดูชุดเนื้อหาการเรียนรู้ทั้งหมด\n",
"\n",
"ตามที่เราได้พูดถึงไปแล้ว เพอร์เซปตรอนช่วยให้คุณแก้ปัญหา **การจำแนกประเภทแบบทวิภาค** หรือการจัดกลุ่มตัวอย่างข้อมูลเข้าไปในสองประเภท - เราสามารถเรียกมันว่า **บวก** และ **ลบ**\n",
"ดังที่เราได้พูดถึงไปแล้ว เพอร์เซปตรอนช่วยให้คุณแก้ปัญหา **การจำแนกประเภทแบบทวิภาค** ได้ นั่นคือการจำแนกตัวอย่างข้อมูลเข้าเป็นสองคลาส - เราสามารถเรียกมันว่า **บวก** และ **ลบ**\n",
"\n",
"ก่อนอื่น มาเริ่มต้นด้วยการนำเข้าบางไลบรารีที่จำเป็น\n"
"ก่อนอื่น มานำเข้าไลบรารีที่จำเป็นบางตัวกันก่อน\n"
]
},
{
@ -47,9 +47,9 @@
}
},
"source": [
"## ปัญหาทดลอง\n",
"## ปัญหาตัวอย่าง\n",
"\n",
"เริ่มต้นด้วยปัญหาทดลองง่าย ๆ โดยเรามีคุณลักษณะนำเข้าอยู่สองตัวอย่าง เช่น ในทางการแพทย์ เราอาจต้องการจำแนกเนื้องอกว่าเป็นชนิดไม่ร้ายแรงหรือชนิดร้ายแรง โดยพิจารณาจากขนาดและอายุของมัน\n",
"เริ่มต้นกันด้วยปัญหาตัวอย่างง่าย ๆ โดยเรามีคุณลักษณะข้อมูลสองตัวอย่าง เช่น ในทางการแพทย์ เราอาจต้องการจัดประเภทเนื้องอกว่าเป็นชนิดไม่ร้ายแรงหรือชนิดร้ายแรง โดยพิจารณาจากขนาดและอายุของมัน\n",
"\n",
"เราจะสร้างชุดข้อมูลการจำแนกแบบสุ่มโดยใช้ฟังก์ชัน `make_classification` จากไลบรารี SciKit Learn:\n"
]
@ -95,7 +95,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"มาลองพล็อตชุดข้อมูลกัน:\n"
"มาลองวาดกราฟชุดข้อมูลกัน:\n"
]
},
{
@ -154,11 +154,11 @@
"source": [
"## เพอร์เซปตรอน\n",
"\n",
"เนื่องจากเพอร์เซปตรอนเป็นตัวจำแนกประเภทแบบไบนารี สำหรับเวกเตอร์อินพุต $x$ แต่ละตัว ผลลัพธ์ของเพอร์เซปตรอนจะเป็น +1 หรือ -1 ขึ้นอยู่กับคลาส ผลลัพธ์จะถูกคำนวณโดยใช้สูตร\n",
"เนื่องจากเพอร์เซปตรอนเป็นตัวจำแนกประเภทแบบไบนารี สำหรับแต่ละเวกเตอร์อินพุต $x$ ผลลัพธ์ของเพอร์เซปตรอนของเราจะเป็น +1 หรือ -1 ขึ้นอยู่กับคลาส ผลลัพธ์จะถูกคำนวณโดยใช้สูตร\n",
"\n",
"$$y(\\mathbf{x}) = f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x})$$\n",
"\n",
"โดยที่ $\\mathbf{w}$ คือเวกเตอร์น้ำหนัก และ $f$ คือฟังก์ชันการกระตุ้นแบบขั้น:\n",
"โดยที่ $\\mathbf{w}$ เป็นเวกเตอร์น้ำหนัก และ $f$ เป็นฟังก์ชันการกระตุ้นแบบขั้น:\n",
"$$\n",
"f(x) = \\begin{cases}\n",
" +1 & x \\geq 0 \\\\\n",
@ -166,7 +166,7 @@
" \\end{cases} \\\\\n",
"$$\n",
"\n",
"อย่างไรก็ตาม โมเดลเชิงเส้นทั่วไปควรมีไบแอสด้วย กล่าวคือ ในอุดมคติเราควรคำนวณ $y$ เป็น $y=f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}+\\mathbf{b})$ เพื่อทำให้โมเดลของเราง่ายขึ้น เราสามารถกำจัดเทอมไบแอสนี้ได้โดยการเพิ่มมิติหนึ่งเข้าไปในคุณลักษณะอินพุตของเรา ซึ่งมิตินี้จะมีค่าเท่ากับ 1 เสมอ:\n"
"อย่างไรก็ตาม โมเดลเชิงเส้นทั่วไปควรมีไบแอสด้วย กล่าวคือ ในอุดมคติเราควรคำนวณ $y$ เป็น $y=f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}+\\mathbf{b})$ เพื่อทำให้โมเดลของเราง่ายขึ้น เราสามารถกำจัดเทอมไบแอสนี้ได้โดยการเพิ่มมิติหนึ่งเข้าไปในคุณลักษณะอินพุตของเรา ซึ่งจะมีค่าเท่ากับ 1 เสมอ:\n"
]
},
{
@ -204,22 +204,22 @@
}
},
"source": [
"## อัลกอริึมการฝึก\n",
"## อัลกอริึมการฝึก\n",
"\n",
"เพื่อฝึก Perceptron เราจำเป็นต้องหาค่าน้ำหนัก $\\mathbf{w}$ ที่จะช่วยลดข้อผิดพลาดให้ได้มากที่สุด โดยข้อผิดพลาดถูกนิยามด้วย **เกณฑ์ของ Perceptron**:\n",
"เพื่อฝึก perceptron เราจำเป็นต้องหาค่าน้ำหนัก $\\mathbf{w}$ ที่จะลดข้อผิดพลาดให้น้อยที่สุด ข้อผิดพลาดถูกนิยามโดยใช้ **perceptron criteria**:\n",
"\n",
"$$E(\\mathbf{w}) = -\\sum_{n \\in \\mathcal{M}}\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}_{n}t_{n}$$\n",
" \n",
" * $t_{n} \\in \\{-1, +1\\}$ สำหรับตัวอย่างการฝึกที่เป็นลบและบวกตามลำดับ\n",
" * $\\mathcal{M}$ - เซตของตัวอย่างที่ถูกจัดประเภทผิด\n",
" \n",
"เราจะใช้กระบวนการ **Gradient Descent** โดยเริ่มต้นด้วยค่าน้ำหนักเริ่มต้นแบบสุ่ม $\\mathbf{w}^{(0)}$ และปรับค่าน้ำหนักในแต่ละขั้นตอนของการฝึกโดยใช้ Gradient ของ $E$:\n",
"เราจะใช้กระบวนการ **gradient descent** โดยเริ่มต้นด้วยค่าน้ำหนักสุ่มเริ่มต้น $\\mathbf{w}^{(0)}$ เราจะปรับค่าน้ำหนักในแต่ละขั้นตอนของการฝึกโดยใช้ gradient ของ $E$:\n",
"\n",
"$$\\mathbf{w}^{\\tau + 1}=\\mathbf{w}^{\\tau} - \\eta \\nabla E(\\mathbf{w}) = \\mathbf{w}^{\\tau} + \\eta\\sum_{n \\in \\mathcal{M}}\\mathbf{x}_{n} t_{n}$$\n",
"\n",
"โดยที่ $\\eta$ คือ **อัตราการเรียนรู้** และ $\\tau\\in\\mathbb{N}$ คือจำนวนรอบของการทำซ้ำ\n",
"โดยที่ $\\eta$ คือ **learning rate** และ $\\tau\\in\\mathbb{N}$ - จำนวนรอบการทำงาน\n",
"\n",
"มานิยามอัลกอริึมนี้ใน Python กัน:\n"
"มานิยามอัลกอริึมนี้ใน Python กัน:\n"
]
},
{
@ -271,7 +271,9 @@
{
"cell_type": "markdown",
"metadata": {},
"source": []
"source": [
"ตอนนี้มาเริ่มการฝึกอบรมบนชุดข้อมูลของเรา:\n"
]
},
{
"cell_type": "code",
@ -309,7 +311,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"ดังที่คุณเห็น ความแม่นยำเริ่มต้นอยู่ที่ประมาณ 50% แต่จะเพิ่มขึ้นอย่างรวดเร็วไปสู่ค่าที่สูงขึ้นใกล้เคียง 90%\n",
"ดังที่คุณเห็น ความแม่นยำเริ่มต้นอยู่ที่ประมาณ 50% แต่เพิ่มขึ้นอย่างรวดเร็วไปสู่ค่าที่สูงขึ้นใกล้เคียง 90%\n",
"\n",
"มาลองดูว่าคลาสต่าง ๆ ถูกแยกออกจากกันอย่างไร ฟังก์ชันการจำแนกของเรามีลักษณะเป็น $\\mathbf{w}^Tx$ และจะมีค่ามากกว่า 0 สำหรับคลาสหนึ่ง และมีค่าต่ำกว่า 0 สำหรับอีกคลาสหนึ่ง ดังนั้น เส้นแบ่งคลาสจะถูกกำหนดโดย $\\mathbf{w}^Tx = 0$ เนื่องจากเรามีเพียงสองมิติ $x_0$ และ $x_1$ สมการของเส้นจะเป็น $w_0x_0+w_1x_1+w_2 = 0$ (อย่าลืมว่าเราได้กำหนดมิติพิเศษ $x_2=1$ ไว้อย่างชัดเจน) มาลองวาดเส้นนี้กัน:\n"
]
@ -379,7 +381,7 @@
"source": [
"## ประเมินผลบนชุดข้อมูลทดสอบ\n",
"\n",
"ในตอนแรก เราได้แยกข้อมูลบางส่วนออกมาเพื่อใช้เป็นชุดข้อมูลทดสอบ มาดูกันว่าตัวจัดประเภทของเรามีความแม่นยำแค่ไหนบนชุดข้อมูลทดสอบนี้ เพื่อทำสิ่งนี้ เราจะขยายชุดข้อมูลทดสอบด้วยมิติพิเศษ คูณด้วยเมทริกซ์น้ำหนัก และตรวจสอบให้แน่ใจว่าค่าที่ได้มีเครื่องหมายเดียวกันกับป้ายกำกับ (+1 หรือ -1) จากนั้นเราจะรวมค่าบูลีนทั้งหมดเข้าด้วยกันและหารด้วยความยาวของตัวอย่างทดสอบเพื่อหาค่าความแม่นยำ:\n"
"ในตอนแรก เราได้แยกข้อมูลบางส่วนออกมาเป็นชุดข้อมูลทดสอบ ลองมาดูกันว่าเครื่องมือจำแนกของเรามีความแม่นยำแค่ไหนบนชุดข้อมูลทดสอบนี้ เพื่อทำสิ่งนี้ เราจะขยายชุดข้อมูลทดสอบด้วยมิติพิเศษ คูณด้วยเมทริกซ์น้ำหนัก และตรวจสอบให้แน่ใจว่าค่าที่ได้มีเครื่องหมายเดียวกับป้ายกำกับ (+1 หรือ -1) จากนั้นเรารวมค่าบูลีนทั้งหมดเข้าด้วยกันและหารด้วยความยาวของตัวอย่างทดสอบ เพื่อคำนวณความแม่นยำ:\n"
]
},
{
@ -418,9 +420,9 @@
}
},
"source": [
"## การสังเกตกระบวนการฝึกอบรม\n",
"## การสังเกตกระบวนการฝึก\n",
"\n",
"เราเคยเห็นมาก่อนแล้วว่า ความแม่นยำลดลงระหว่างการฝึกอบรม จะดีไม่น้อยถ้าเราได้เห็นว่าการแยกเส้นแบ่งเปลี่ยนแปลงอย่างไรในระหว่างการฝึกอบรม โค้ดด้านล่างนี้จะแสดงภาพทุกอย่างในกราฟเดียว และคุณจะสามารถเลื่อนตัวเลื่อนเพื่อ \"เดินทางข้ามเวลา\" ผ่านกระบวนการฝึกอบรมได้\n"
"เราเคยเห็นมาก่อนแล้วว่า ความแม่นยำลดลงระหว่างการฝึก จะดีมากถ้าเราได้เห็นว่าการเปลี่ยนแปลงของเส้นแบ่งเกิดขึ้นอย่างไรระหว่างการฝึก โค้ดด้านล่างนี้จะช่วยให้คุณสามารถมองเห็นทุกอย่างในกราฟเดียว และคุณจะสามารถเลื่อนสไลเดอร์เพื่อ \"เดินทางข้ามเวลา\" ผ่านกระบวนการฝึกได้\n"
]
},
{
@ -527,7 +529,7 @@
"source": [
"## ข้อจำกัดของ Perceptron\n",
"\n",
"อย่างที่คุณได้เห็นข้างต้น Perceptron เป็น **ตัวจำแนกเชิงเส้น** ซึ่งสามารถแยกแยะระหว่างสองคลาสได้ดีหากคลาสเหล่านั้น **แยกออกจากกันได้ในเชิงเส้น** หรือสามารถแยกได้ด้วยเส้นตรง อย่างไรก็ตาม หากไม่สามารถแยกได้ในลักษณะนี้ กระบวนการฝึกของ Perceptron จะไม่สามารถหาคำตอบที่เหมาะสมได้\n",
"อย่างที่คุณได้เห็นข้างต้น Perceptron เป็น **ตัวจำแนกเชิงเส้น** ซึ่งสามารถแยกแยะระหว่างสองคลาสได้ดีหากคลาสเหล่านั้น **แยกออกจากกันได้เชิงเส้น** หรือสามารถแยกได้ด้วยเส้นตรง แต่ถ้าหากไม่เป็นเช่นนั้น กระบวนการฝึกของ Perceptron จะไม่สามารถหาคำตอบที่เหมาะสมได้\n",
"\n",
"ตัวอย่างที่ชัดเจนที่สุดของปัญหาที่ Perceptron ไม่สามารถแก้ไขได้คือปัญหาที่เรียกว่า **XOR problem** เราต้องการให้ Perceptron ของเราเรียนรู้ฟังก์ชันบูลีน XOR ซึ่งมีตารางความจริงดังนี้:\n",
"\n",
@ -603,19 +605,19 @@
}
},
"source": [
"จากกราฟด้านบน คุณจะเห็นได้ว่าความแม่นยำไม่เคยเกิน 75% เนื่องจากเป็นไปไม่ได้ที่จะลากเส้นตรงเพื่อให้ครอบคลุมตัวอย่างทั้งหมดได้อย่างถูกต้อง\n",
"จากกราฟด้านบน คุณจะเห็นว่า ความแม่นยำไม่เคยเกิน 75% เนื่องจากไม่สามารถวาดเส้นตรงในลักษณะที่จะทำให้ตัวอย่างทั้งหมดถูกต้องได้\n",
"\n",
"ปัญหา XOR เป็นตัวอย่างคลาสสิกที่แสดงถึงข้อจำกัดของ perceptron และถูกชี้ให้เห็นโดย Marvin Minsky และ Seymour Papert ในปี 1969 ในหนังสือของพวกเขา [Perceptrons](https://en.wikipedia.org/wiki/Perceptrons_(book)) การสังเกตนี้ทำให้การวิจัยในด้านเครือข่ายประสาทเทียมชะลอตัวลงไปเกือบ 10 ปี แม้ว่าความจริงแล้ว - และเราจะเห็นในส่วนถัดไปของคอร์สนี้ - perceptron แบบหลายชั้นสามารถแก้ปัญหาเหล่านี้ได้อย่างสมบูรณ์แบบ\n",
"ปัญหา XOR เป็นตัวอย่างคลาสสิกของข้อจำกัดของ perceptron ซึ่งถูกชี้ให้เห็นโดย Marvin Minsky และ Seymour Papert ในปี 1969 ในหนังสือของพวกเขา [Perceptrons](https://en.wikipedia.org/wiki/Perceptrons_(book)) การสังเกตนี้ทำให้การวิจัยในด้านเครือข่ายประสาทเทียมถูกจำกัดไปเกือบ 10 ปี แม้ว่า - และเราจะเห็นในส่วนถัดไปของหลักสูตร - perceptron แบบหลายชั้นสามารถแก้ปัญหาเหล่านี้ได้อย่างสมบูรณ์แบบ\n",
"\n",
"## ตัวอย่างที่ซับซ้อน - MNIST\n",
"\n",
"แม้ว่า perceptron จะไม่สามารถแก้ปัญหา XOR ได้ แต่มันสามารถแก้ปัญหาที่ซับซ้อนกว่านั้นได้มาก เช่น การจดจำลายมือ\n",
"แม้ว่า perceptron จะไม่สามารถแก้ปัญหา XOR ได้ แต่ก็สามารถแก้ปัญหาที่ซับซ้อนกว่านั้นได้ เช่น การจดจำตัวอักษรที่เขียนด้วยมือ\n",
"\n",
"ชุดข้อมูลที่มักถูกใช้เมื่อเรียนรู้เกี่ยวกับการเรียนรู้ของเครื่องเรียกว่า [MNIST](https://en.wikipedia.org/wiki/MNIST_database) ชุดข้อมูลนี้ถูกสร้างขึ้นโดย Modified National Institute of Standards and Technology และประกอบด้วยชุดข้อมูลการฝึกฝนจำนวน 60,000 ตัวเลขที่เขียนด้วยมือ ซึ่งรวบรวมมาจากนักศึกษาและพนักงานประมาณ 250 คนของสถาบัน นอกจากนี้ยังมีชุดข้อมูลทดสอบจำนวน 10,000 ตัวเลข ซึ่งรวบรวมมาจากบุคคลอื่นๆ\n",
"ชุดข้อมูลที่มักถูกใช้เมื่อเรียนรู้การเรียนรู้ของเครื่องเรียกว่า [MNIST](https://en.wikipedia.org/wiki/MNIST_database) ซึ่งถูกสร้างขึ้นโดย Modified National Institute of Standards and Technology และประกอบด้วยชุดข้อมูลการฝึก 60,000 ตัวเลขที่เขียนด้วยมือ ซึ่งรวบรวมจากนักเรียนและพนักงานประมาณ 250 คนของสถาบัน นอกจากนี้ยังมีชุดข้อมูลทดสอบ 10,000 ตัวเลขที่รวบรวมจากบุคคลอื่นๆ\n",
"\n",
"ตัวเลขทั้งหมดแสดงในรูปของภาพขาวดำขนาด 28x28 พิกเซล\n",
"ตัวเลขทั้งหมดแสดงในรูปภาพระดับสีเทาขนาด 28x28 พิกเซล\n",
"\n",
"> ชุดข้อมูล MNIST มีให้ใช้งานในรูปแบบการแข่งขันการฝึกฝนบน [Kaggle](https://www.kaggle.com/c/digit-recognizer) ซึ่งเป็นเว็บไซต์ที่จัดการแข่งขันและกิจกรรมเกี่ยวกับการเรียนรู้ของเครื่อง เมื่อคุณเรียนรู้วิธีการจำแนกตัวเลขใน MNIST แล้ว คุณสามารถส่งคำตอบของคุณไปยัง Kaggle เพื่อดูว่าคำตอบของคุณได้รับการจัดอันดับอย่างไรเมื่อเทียบกับผู้เข้าร่วมคนอื่นๆ\n",
"> ชุดข้อมูล MNIST มีให้เป็นการแข่งขันการฝึกอบรมบน [Kaggle](https://www.kaggle.com/c/digit-recognizer) ซึ่งเป็นเว็บไซต์ที่จัดการแข่งขันและการประกวดการเรียนรู้ของเครื่อง เมื่อคุณเรียนรู้วิธีการจำแนกตัวเลข MNIST แล้ว คุณสามารถส่งคำตอบของคุณไปยัง Kaggle เพื่อดูว่าคำตอบของคุณได้รับการจัดอันดับอย่างไรเมื่อเทียบกับผู้เข้าร่วมคนอื่นๆ\n",
"\n",
"เราจะเริ่มต้นด้วยการโหลดชุดข้อมูล MNIST:\n"
]
@ -642,7 +644,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"มาพล็อตชุดข้อมูลกันเถอะ:\n"
"มาแสดงชุดข้อมูลกันเถอะ:\n"
]
},
{
@ -693,7 +695,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"เนื่องจากเพอร์เซปตรอนเป็นตัวจำแนกประเภทแบบไบนารี เราจะจำกัดปัญหาให้เหลือเพียงการจดจำตัวเลขสองตัวเท่านั้น ฟังก์ชันด้านล่างจะเติมข้อมูลในอาร์เรย์ตัวอย่างบวกและลบด้วยตัวเลขสองตัวที่กำหนด (และจะแสดงตัวอย่างของตัวเลขเหล่านั้นเพื่อความชัดเจน)\n"
"เนื่องจากเพอร์เซปตรอนเป็นตัวจำแนกประเภทแบบไบนารี เราจะจำกัดปัญหาของเราให้รู้จำเพียงสองตัวเลข ฟังก์ชันด้านล่างนี้จะเติมข้อมูลในอาร์เรย์ตัวอย่างบวกและลบด้วยตัวเลขสองตัวที่กำหนด (และจะแสดงตัวอย่างของตัวเลขเหล่านั้นเพื่อความชัดเจน)\n"
]
},
{
@ -732,7 +734,9 @@
{
"cell_type": "markdown",
"metadata": {},
"source": []
"source": [
"เราจะเริ่มต้นด้วยการพยายามจำแนกระหว่าง 0 และ 1:\n"
]
},
{
"cell_type": "code",
@ -827,11 +831,11 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"โปรดสังเกตว่าความแม่นยำเพิ่มขึ้นอย่างรวดเร็วเกือบถึง 100% ในเวลาอันสั้น\n",
"โปรดสังเกตว่าความแม่นยำเพิ่มขึ้นจนเกือบถึง 100% อย่างรวดเร็ว\n",
"\n",
"โปรดเลื่อนแถบเลื่อน (slider) ไปยังตำแหน่งใดตำแหน่งหนึ่งใกล้กับช่วงท้ายของการฝึก และสังเกตเมทริกซ์น้ำหนัก (weight matrix) ที่แสดงอยู่ทางด้านซ้าย เมทริกซ์นี้จะช่วยให้คุณเข้าใจว่าการทำงานของเพอร์เซปตรอน (perceptron) เป็นอย่างไร คุณจะเห็นค่าน้ำหนักสูงในส่วนกลางของฟิลด์ ซึ่งสอดคล้องกับพิกเซลที่มักจะปรากฏในตัวเลข 1 และค่าติดลบต่ำที่ด้านข้าง ซึ่งเป็นส่วนที่มักจะเป็นของตัวเลข 0 ดังนั้น หากตัวเลขที่แสดงให้เพอร์เซปตรอนคือ 1 จริง ส่วนกลางของตัวเลขจะถูกคูณด้วยค่าสูง ทำให้ได้ผลลัพธ์เป็นบวก ในทางกลับกัน เมื่อเพอร์เซปตรอนเห็นตัวเลข 0 พิกเซลที่เกี่ยวข้องจะถูกคูณด้วยตัวเลขติดลบ\n",
"กรุณาเลื่อนแถบสไลด์ไปยังตำแหน่งใกล้จุดสิ้นสุดของการฝึก และสังเกตเมทริกซ์น้ำหนักที่แสดงทางด้านซ้าย เมทริกซ์นี้จะช่วยให้คุณเข้าใจว่าการทำงานของ perceptron เป็นอย่างไร คุณจะเห็นค่าน้ำหนักสูงในส่วนกลางของพื้นที่ ซึ่งสอดคล้องกับพิกเซลที่มักปรากฏในตัวเลข 1 และค่าติดลบต่ำบริเวณด้านข้าง ซึ่งเป็นส่วนของตัวเลข 0 ดังนั้น หากตัวเลขที่นำเสนอให้ perceptron คือ 1 ส่วนกลางของตัวเลขจะถูกคูณด้วยค่าสูง ส่งผลให้ได้ผลลัพธ์เป็นบวก ในทางกลับกัน เมื่อ perceptron เห็นตัวเลข 0 พิกเซลที่เกี่ยวข้องจะถูกคูณด้วยตัวเลขติดลบ\n",
"\n",
"> คุณอาจสังเกตได้ว่าหากเราให้เพอร์เซปตรอนดูตัวเลข 1 ที่เลื่อนในแนวนอนเล็กน้อย ทำให้พิกเซลของมันไปอยู่ในตำแหน่งที่มีส่วนแนวตั้งของตัวเลข 0 เราอาจได้รับผลลัพธ์ที่ไม่ถูกต้อง เนื่องจากลักษณะของชุดข้อมูล MNIST ของเราคือตัวเลขทั้งหมดจะถูกจัดให้อยู่ตรงกลางและจัดตำแหน่งอย่างเหมาะสม และเพอร์เซปตรอนอาศัยสิ่งนี้ในการแยกแยะตัวเลข\n",
"> คุณอาจสังเกตได้ว่าหากเราให้ perceptron ตัวเลข 1 ที่ถูกเลื่อนในแนวนอนเล็กน้อยจนพิกเซลของมันไปอยู่ในตำแหน่งที่มีส่วนแนวตั้งของตัวเลข 0 เราอาจได้รับผลลัพธ์ที่ไม่ถูกต้อง เนื่องจากลักษณะของชุดข้อมูล MNIST ของเราคือตัวเลขทั้งหมดจะถูกจัดให้อยู่ตรงกลางและวางตำแหน่งอย่างเหมาะสม และ perceptron อาศัยสิ่งนี้ในการแยกแยะตัวเลข\n",
"\n",
"ตอนนี้ลองใช้ตัวเลขอื่นดู:\n"
]
@ -913,7 +917,7 @@
"\n",
"เพื่อทำความเข้าใจว่าทำไมสิ่งนี้ถึงเกิดขึ้น เราสามารถลองใช้ [Principal Component Analysis](https://en.wikipedia.org/wiki/Principal_component_analysis) (PCA) ซึ่งเป็นเทคนิคการเรียนรู้ของเครื่องที่ใช้ลดมิติของชุดข้อมูลนำเข้า โดยมีเป้าหมายเพื่อให้ได้การแยกประเภทที่ดีที่สุดระหว่างคลาสต่าง ๆ\n",
"\n",
"ในกรณีของเรา ภาพนำเข้ามี 784 พิกเซล (คุณลักษณะนำเข้า) และเราต้องการใช้ PCA เพื่อลดจำนวนพารามิเตอร์ลงเหลือเพียง 2 เพื่อที่เราจะสามารถวาดกราฟได้ พารามิเตอร์ทั้งสองนี้จะเป็นการรวมเชิงเส้นของคุณลักษณะดั้งเดิม และเราสามารถมองกระบวนการนี้ว่าเป็นการ \"หมุน\" พื้นที่ 784 มิติเดิมของเรา และสังเกตการฉายภาพของมันไปยังพื้นที่ 2 มิติ จนกว่าเราจะได้มุมมองที่ดีที่สุดที่แยกคลาสออกจากกัน\n"
"ในกรณีของเรา ภาพนำเข้ามี 784 พิกเซล (คุณลักษณะนำเข้า) และเราต้องการใช้ PCA เพื่อลดจำนวนพารามิเตอร์ลงเหลือเพียง 2 เพื่อที่เราจะสามารถวาดกราฟได้ พารามิเตอร์ทั้งสองนี้จะเป็นการรวมเชิงเส้นของคุณลักษณะดั้งเดิม และเราสามารถมองกระบวนการนี้ว่าเป็นการ \"หมุน\" พื้นที่ 784 มิติเดิมของเรา และสังเกตการฉายภาพของมันไปยังพื้นที่ 2 มิติ จนกว่าเราจะได้มุมมองที่ดีที่สุดที่แยกคลาสออกจากกันได้\n"
]
},
{
@ -1023,17 +1027,17 @@
}
},
"source": [
"ดังที่คุณเห็น ตัวเลข 0 และ 1 สามารถแยกออกจากกันได้อย่างชัดเจนด้วยเส้นตรง ซึ่งแสดงให้เห็นว่าในพื้นที่ 784 มิติเดิม จุดที่สอดคล้องกับตัวเลขเหล่านี้สามารถแยกออกจากกันได้เชิงเส้น ในกรณีของตัวเลข 2 และ 5 เราไม่สามารถหาการฉายภาพที่ดีเพื่อแยกตัวเลขเหล่านี้ออกจากกันได้อย่างชัดเจน และดังนั้นจึงมีบางกรณีที่เกิดการจัดประเภทผิดพลาด\n",
"ดังที่คุณเห็น ตัวเลข 0 และ 1 สามารถแยกออกจากกันได้อย่างชัดเจนด้วยเส้นตรง ซึ่งบ่งชี้ว่าในพื้นที่ 784 มิติเดิม จุดที่สอดคล้องกับตัวเลขก็สามารถแยกออกจากกันได้เชิงเส้นเช่นกัน ในกรณีของตัวเลข 2 และ 5 เราไม่สามารถหาการฉายภาพที่ดีเพื่อแยกตัวเลขออกจากกันได้อย่างชัดเจน และดังนั้นจึงมีบางกรณีที่เกิดการจัดประเภทผิดพลาด\n",
"\n",
"> ในภายหลังในคอร์สนี้ เราจะเรียนรู้วิธีสร้างตัวจำแนกที่ไม่เป็นเชิงเส้นโดยใช้ Neural Networks และวิธีจัดการกับปัญหาที่ตัวเลขไม่ได้ถูกจัดเรียงอย่างเหมาะสม ในไม่ช้าเราจะสามารถบรรลุความแม่นยำเกิน 99% ในการจำแนกตัวเลข MNIST โดยการจัดประเภทตัวเลขเหล่านี้ออกเป็น 10 กลุ่มที่แตกต่างกัน\n",
"> ในบทเรียนนี้ เราจะเรียนรู้วิธีสร้างตัวจำแนกที่ไม่เป็นเชิงเส้นโดยใช้ Neural Networks และวิธีจัดการกับปัญหาที่ตัวเลขไม่ได้เรียงตัวอย่างเหมาะสม ในไม่ช้าเราจะสามารถบรรลุความแม่นยำเกิน 99% ในการจำแนกตัวเลข MNIST โดยแบ่งออกเป็น 10 คลาสที่แตกต่างกัน\n",
"\n",
"## สิ่งที่ควรจดจำ\n",
"## สิ่งที่ได้เรียนรู้\n",
"\n",
" * เราได้เรียนรู้เกี่ยวกับสถาปัตยกรรมของ Neural Network ที่ง่ายที่สุด - one-layer perceptron\n",
" * เราได้ทดลองสร้าง perceptron ด้วยตัวเอง โดยใช้กระบวนการฝึกอบรมง่าย ๆ ที่อิงกับ gradient descent\n",
" * แม้จะมีความเรียบง่าย แต่ one-layer perceptron สามารถแก้ปัญหาที่ซับซ้อนเกี่ยวกับการจดจำตัวเลขที่เขียนด้วยมือได้\n",
" * one-layer perceptron เป็นตัวจำแนกเชิงเส้น และดังนั้นจึงมีพลังในการจัดประเภทเหมือนกับ logistic regression\n",
" * ในพื้นที่ตัวอย่าง perceptron สามารถแยกสองกลุ่มของข้อมูลอินพุตออกจากกันได้โดยใช้ hyperplane\n"
" * เราได้ทดลองสร้าง perceptron \"ด้วยมือ\" โดยใช้กระบวนการฝึกอบรมง่าย ๆ ที่อิงกับ gradient descent\n",
" * แม้จะมีความเรียบง่าย แต่ one-layered perceptron สามารถแก้ปัญหาที่ค่อนข้างซับซ้อนเกี่ยวกับการจดจำตัวเลขที่เขียนด้วยมือได้\n",
" * one-layered perceptron เป็นตัวจำแนกเชิงเส้น และดังนั้นจึงมีพลังในการจำแนกเทียบเท่ากับ logistic regression\n",
" * ในพื้นที่ตัวอย่าง perceptron สามารถแยกสองคลาสของข้อมูลอินพุตโดยใช้ hyperplane\n"
]
},
{
@ -1042,14 +1046,14 @@
"source": [
"## เครดิต\n",
"\n",
"สมุดบันทึกนี้เป็นส่วนหนึ่งของ [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners) และจัดทำโดย [Dmitry Soshnikov](http://soshnikov.com) โดยได้รับแรงบันดาลใจจากเวิร์กช็อป Neural Network ที่ Microsoft Research Cambridge โค้ดบางส่วนและสื่อประกอบการอธิบายถูกนำมาจากการนำเสนอของ [Katja Hoffmann](https://www.microsoft.com/en-us/research/people/kahofman/), [Matthew Johnson](https://www.microsoft.com/en-us/research/people/matjoh/) และ [Ryoto Tomioka](https://www.microsoft.com/en-us/research/people/ryoto/) รวมถึงจากคลังเก็บ [NeuroWorkshop](http://github.com/shwars/NeuroWorkshop)\n"
"สมุดบันทึกนี้เป็นส่วนหนึ่งของ [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners) และจัดทำโดย [Dmitry Soshnikov](http://soshnikov.com) โดยได้รับแรงบันดาลใจจากเวิร์กช็อป Neural Network ที่ Microsoft Research Cambridge โค้ดและสื่อประกอบบางส่วนถูกนำมาจากการนำเสนอโดย [Katja Hoffmann](https://www.microsoft.com/en-us/research/people/kahofman/), [Matthew Johnson](https://www.microsoft.com/en-us/research/people/matjoh/) และ [Ryoto Tomioka](https://www.microsoft.com/en-us/research/people/ryoto/) รวมถึงจากคลังข้อมูล [NeuroWorkshop](http://github.com/shwars/NeuroWorkshop)\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**ข้อจำกัดความรับผิดชอบ**: \nเอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้องมากที่สุด แต่โปรดทราบว่าการแปลโดยอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่ถูกต้อง เอกสารต้นฉบับในภาษาดั้งเดิมควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ ขอแนะนำให้ใช้บริการแปลภาษามืออาชีพ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความที่ผิดพลาดซึ่งเกิดจากการใช้การแปลนี้\n"
"\n---\n\n**ข้อจำกัดความรับผิดชอบ**: \nเอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้อง แต่โปรดทราบว่าการแปลอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่ถูกต้อง เอกสารต้นฉบับในภาษาดั้งเดิมควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ ขอแนะนำให้ใช้บริการแปลภาษามืออาชีพ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความผิดที่เกิดจากการใช้การแปลนี้\n"
]
}
],
@ -1078,8 +1082,8 @@
"start_slideshow_at": "selected"
},
"coopTranslator": {
"original_hash": "914fc55f59efc7e17b8130d4033ac617",
"translation_date": "2025-08-29T10:23:55+00:00",
"original_hash": "d67e5b54ba20b507aa88d71aa3d042d8",
"translation_date": "2025-10-03T13:28:34+00:00",
"source_file": "lessons/3-NeuralNetworks/03-Perceptron/Perceptron.ipynb",
"language_code": "th"
}

View File

@ -13,7 +13,7 @@
"\n",
"> Ang notebook na ito ay bahagi ng [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners). Bisitahin ang repository para sa kumpletong set ng mga materyales sa pag-aaral.\n",
"\n",
"Tulad ng napag-usapan, ang perceptron ay nagbibigay-daan sa iyo na lutasin ang **binary classification problem**, ibig sabihin, upang uriin ang mga input na halimbawa sa dalawang klase - maaari nating tawagin itong **positibo** at **negatibo**.\n",
"Tulad ng napag-usapan, ang perceptron ay nagbibigay-daan sa iyo na lutasin ang **binary classification problem**, ibig sabihin, upang i-classify ang mga input na halimbawa sa dalawang klase - maaari natin silang tawaging **positive** at **negative**.\n",
"\n",
"Una, mag-import tayo ng ilang kinakailangang mga library.\n"
]
@ -51,7 +51,7 @@
"\n",
"Para magsimula, simulan natin sa isang simpleng problema, kung saan mayroon tayong dalawang input na katangian. Halimbawa, sa medisina, maaaring gusto nating uriin ang mga tumor bilang benign o malignant, depende sa laki at edad nito.\n",
"\n",
"Gagawa tayo ng random na classification dataset gamit ang `make_classification` na function mula sa SciKit Learn library:\n"
"Gagawa tayo ng random na dataset para sa klasipikasyon gamit ang `make_classification` na function mula sa SciKit Learn library:\n"
]
},
{
@ -95,7 +95,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"I-plot din natin ang dataset:\n"
"Iplot din natin ang dataset:\n"
]
},
{
@ -154,7 +154,7 @@
"source": [
"## Perceptron\n",
"\n",
"Dahil ang perceptron ay isang binary classifier, para sa bawat input vector $x$, ang output ng ating perceptron ay magiging alinman sa +1 o -1, depende sa klase. Ang output ay kakalkulahin gamit ang pormula:\n",
"Dahil ang perceptron ay isang binary classifier, para sa bawat input vector $x$, ang output ng ating perceptron ay magiging +1 o -1, depende sa klase. Ang output ay kakalkulahin gamit ang formula:\n",
"\n",
"$$y(\\mathbf{x}) = f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x})$$\n",
"\n",
@ -166,7 +166,7 @@
" \\end{cases} \\\\\n",
"$$\n",
"\n",
"Gayunpaman, ang isang generic linear model ay dapat ding may bias, ibig sabihin, sa ideal na sitwasyon, dapat nating kalkulahin ang $y$ bilang $y=f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}+\\mathbf{b})$. Upang gawing mas simple ang ating modelo, maaari nating alisin ang bias term na ito sa pamamagitan ng pagdaragdag ng isa pang dimensyon sa ating input features, na laging katumbas ng 1:\n"
"Gayunpaman, ang isang pangkalahatang linear na modelo ay dapat ding may bias, ibig sabihin, ideal na kakalkulahin natin ang $y$ bilang $y=f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}+\\mathbf{b})$. Upang gawing mas simple ang ating modelo, maaari nating alisin ang bias term na ito sa pamamagitan ng pagdaragdag ng isa pang dimensyon sa ating input features, na palaging katumbas ng 1:\n"
]
},
{
@ -206,20 +206,20 @@
"source": [
"## Algorithm sa Pagsasanay\n",
"\n",
"Upang masanay ang perceptron, kailangan nating hanapin ang mga weights $\\mathbf{w}$ na magpapaliit sa error. Ang error ay tinutukoy gamit ang **perceptron criteria**:\n",
"Upang sanayin ang perceptron, kailangan nating hanapin ang mga timbang $\\mathbf{w}$ na magpapaliit sa error. Ang error ay tinutukoy gamit ang **perceptron criteria**:\n",
"\n",
"$$E(\\mathbf{w}) = -\\sum_{n \\in \\mathcal{M}}\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}_{n}t_{n}$$\n",
" \n",
" * $t_{n} \\in \\{-1, +1\\}$ para sa mga negatibo at positibong training samples, ayon sa pagkakabanggit\n",
" * $\\mathcal{M}$ - isang set ng mga maling na-classify na halimbawa\n",
" * $t_{n} \\in \\{-1, +1\\}$ para sa negatibo at positibong mga sample ng pagsasanay, ayon sa pagkakabanggit\n",
" * $\\mathcal{M}$ - isang hanay ng mga maling na-classify na halimbawa\n",
" \n",
"Gagamitin natin ang proseso ng **gradient descent**. Magsisimula tayo sa ilang paunang random na weights $\\mathbf{w}^{(0)}$, at ia-adjust natin ang weights sa bawat hakbang ng pagsasanay gamit ang gradient ng $E$:\n",
"Gagamitin natin ang proseso ng **gradient descent**. Magsisimula sa ilang paunang random na timbang $\\mathbf{w}^{(0)}$, ia-adjust natin ang mga timbang sa bawat hakbang ng pagsasanay gamit ang gradient ng $E$:\n",
"\n",
"$$\\mathbf{w}^{\\tau + 1}=\\mathbf{w}^{\\tau} - \\eta \\nabla E(\\mathbf{w}) = \\mathbf{w}^{\\tau} + \\eta\\sum_{n \\in \\mathcal{M}}\\mathbf{x}_{n} t_{n}$$\n",
"\n",
"kung saan ang $\\eta$ ay isang **learning rate**, at $\\tau\\in\\mathbb{N}$ - bilang ng iteration.\n",
"kung saan ang $\\eta$ ay ang **learning rate**, at $\\tau\\in\\mathbb{N}$ - bilang ng iteration.\n",
"\n",
"Tukuyin natin ang algorithm na ito sa Python:\n"
"I-define natin ang algorithm na ito sa Python:\n"
]
},
{
@ -271,7 +271,9 @@
{
"cell_type": "markdown",
"metadata": {},
"source": []
"source": [
"Ngayon, simulan natin ang pagsasanay sa ating dataset:\n"
]
},
{
"cell_type": "code",
@ -309,9 +311,9 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Tulad ng nakikita mo, ang paunang katumpakan ay nasa paligid ng 50%, ngunit mabilis itong tumataas sa mas mataas na halaga na malapit sa 90%.\n",
"Tulad ng nakikita mo, ang paunang katumpakan ay nasa paligid ng 50%, ngunit mabilis itong tumataas sa mas mataas na halaga malapit sa 90%.\n",
"\n",
"I-visualize natin kung paano nahahati ang mga klase. Ang ating classification function ay mukhang $\\mathbf{w}^Tx$, at ito ay mas mataas sa 0 para sa isang klase, at mas mababa sa 0 para sa isa pa. Kaya, ang linya ng paghihiwalay ng klase ay tinutukoy ng $\\mathbf{w}^Tx = 0$. Dahil mayroon lamang tayong dalawang dimensyon $x_0$ at $x_1$, ang equation para sa linya ay magiging $w_0x_0+w_1x_1+w_2 = 0$ (tandaan na malinaw nating tinukoy ang isang karagdagang dimensyon $x_2=1$). I-plot natin ang linyang ito:\n"
"I-visualize natin kung paano nahihiwalay ang mga klase. Ang ating classification function ay mukhang $\\mathbf{w}^Tx$, at ito ay mas mataas sa 0 para sa isang klase, at mas mababa sa 0 para sa isa pa. Kaya, ang linya ng paghihiwalay ng klase ay tinutukoy ng $\\mathbf{w}^Tx = 0$. Dahil mayroon lamang tayong dalawang dimensyon $x_0$ at $x_1$, ang equation para sa linya ay magiging $w_0x_0+w_1x_1+w_2 = 0$ (tandaan na malinaw nating tinukoy ang isang karagdagang dimensyon $x_2=1$). I-plot natin ang linyang ito:\n"
]
},
{
@ -379,7 +381,7 @@
"source": [
"## Suriin sa Test Dataset\n",
"\n",
"Sa simula, itinabi natin ang ilang datos para sa test dataset. Tingnan natin kung gaano katumpak ang ating classifier sa test dataset na ito. Para magawa ito, pinapalawak din natin ang test dataset gamit ang isang karagdagang dimensyon, imumultiply sa weights matrix, at tinitiyak na ang nakuha na halaga ay may parehong tanda tulad ng label (+1 o -1). Pagkatapos, pinagsasama-sama natin ang lahat ng boolean values at hinahati sa haba ng test sample upang makuha ang accuracy:\n"
"Sa simula, itinabi natin ang ilang data para sa test dataset. Tingnan natin kung gaano katumpak ang ating classifier sa test dataset na ito. Para magawa ito, palalawakin din natin ang test dataset gamit ang isang karagdagang dimensyon, imumultiply sa weights matrix, at titiyakin na ang nakuha na halaga ay may parehong tanda tulad ng label (+1 o -1). Pagkatapos, pagsasamahin natin ang lahat ng boolean values at hahatiin sa haba ng test sample upang makuha ang accuracy:\n"
]
},
{
@ -420,7 +422,7 @@
"source": [
"## Pagmamasid sa proseso ng pagsasanay\n",
"\n",
"Nakita na natin dati kung paano bumababa ang accuracy habang nagsasanay. Maganda sana kung makikita natin kung paano gumagalaw ang linya ng paghihiwalay habang nagsasanay. Ang code sa ibaba ay magpapakita ng lahat sa isang graph, at magagawa mong ilipat ang slider upang \"mag-time travel\" sa proseso ng pagsasanay.\n"
"Nakita na natin dati kung paano bumababa ang accuracy habang nagsasanay. Maganda rin na makita kung paano nagbabago ang linya ng paghihiwalay habang nagsasanay. Ang code sa ibaba ay magpapakita ng lahat sa isang graph, at magagawa mong ilipat ang slider upang \"maglakbay sa oras\" sa proseso ng pagsasanay.\n"
]
},
{
@ -527,16 +529,16 @@
"source": [
"## Mga Limitasyon ng Perceptron\n",
"\n",
"Tulad ng nakita mo sa itaas, ang perceptron ay isang **linear classifier**. Magaling itong makapagtangi sa pagitan ng dalawang klase kung ang mga ito ay **linearly separable**, ibig sabihin, maaaring paghiwalayin gamit ang isang tuwid na linya. Kung hindi, ang proseso ng pagsasanay ng perceptron ay hindi magtatagumpay.\n",
"Tulad ng nakita mo sa itaas, ang perceptron ay isang **linear classifier**. Magaling itong makapaghiwalay ng dalawang klase kung ang mga ito ay **linearly separable**, ibig sabihin, maaaring paghiwalayin gamit ang isang tuwid na linya. Kung hindi, ang proseso ng pagsasanay ng perceptron ay hindi magtatagumpay.\n",
"\n",
"Ang pinaka-halatang halimbawa ng isang problema na hindi kayang lutasin ng perceptron ay ang tinatawag na **XOR problem**. Gusto nating matutunan ng ating perceptron ang XOR boolean function, na may sumusunod na truth table:\n",
"Ang pinaka-halatang halimbawa ng isang problema na hindi kayang lutasin ng perceptron ay ang tinatawag na **XOR problem**. Gusto nating matutunan ng ating perceptron ang XOR boolean function, na may ganitong truth table:\n",
"\n",
"| | 0 | 1 |\n",
"|---|---|---|\n",
"| 0 | 0 | 1 | \n",
"| 1 | 1 | 0 |\n",
"\n",
"Subukan natin ito! Manu-mano nating pupunan ang lahat ng positibo at negatibong training samples, at pagkatapos ay tatawagin ang ating train function na naideklara sa itaas:\n"
"Subukan natin ito! Manu-mano nating pupunuin ang lahat ng positibo at negatibong training samples, at pagkatapos ay tatawagin ang ating train function na na-define sa itaas:\n"
]
},
{
@ -603,19 +605,19 @@
}
},
"source": [
"Tulad ng makikita sa graph sa itaas, ang accuracy ay hindi kailanman lumalagpas sa 75%, dahil imposibleng gumuhit ng isang tuwid na linya na makakakuha ng lahat ng tamang halimbawa.\n",
"Tulad ng makikita mo sa graph sa itaas, ang accuracy ay hindi kailanman lumalampas sa 75%, dahil imposibleng gumuhit ng tuwid na linya na makakakuha ng tamang sagot para sa lahat ng posibleng halimbawa.\n",
"\n",
"Ang XOR problem ay isang klasikong halimbawa ng mga limitasyon ng perceptron, at ito ay itinuro nina Marvin Minsky at Seymour Papert noong 1969 sa kanilang aklat na [Perceptrons](https://en.wikipedia.org/wiki/Perceptrons_(book)). Ang obserbasyong ito ay naglimita sa pananaliksik sa larangan ng neural networks sa halos 10 taon, kahit na - at makikita natin ito sa susunod na bahagi ng ating kurso - ang mga multi-layered perceptrons ay kayang-kayang lutasin ang ganitong mga problema.\n",
"Ang XOR problem ay isang klasikong halimbawa ng mga limitasyon ng perceptron, at ito ay itinuro nina Marvin Minsky at Seymour Papert noong 1969 sa kanilang aklat na [Perceptrons](https://en.wikipedia.org/wiki/Perceptrons_(book)). Ang obserbasyong ito ay naglimita sa pananaliksik sa larangan ng neural networks sa halos 10 taon, kahit na - at makikita natin ito sa susunod na bahagi ng ating kurso - ang multi-layered perceptrons ay lubos na kayang lutasin ang ganitong mga problema.\n",
"\n",
"## Masalimuot na Halimbawa - MNIST\n",
"\n",
"Kahit na hindi kayang lutasin ng perceptron ang XOR problem, kaya nitong lutasin ang mas masalimuot na mga problema, tulad ng pagkilala sa mga sulat-kamay na karakter.\n",
"Bagamat hindi kayang lutasin ng perceptron ang XOR problem, kaya nitong lutasin ang mas maraming masalimuot na problema, tulad ng pagkilala sa mga sulat-kamay na karakter.\n",
"\n",
"Ang isang dataset na madalas gamitin sa pag-aaral ng machine learning ay tinatawag na [MNIST](https://en.wikipedia.org/wiki/MNIST_database). Ito ay nilikha ng Modified National Institute of Standards and Technology, at naglalaman ng training set na may 60,000 sulat-kamay na mga numero, na nakolekta mula sa humigit-kumulang 250 estudyante at empleyado ng institusyon. Mayroon ding test dataset na may 10,000 numero, na nakolekta mula sa iba't ibang indibidwal.\n",
"\n",
"Ang lahat ng numero ay kinakatawan ng grayscale na mga imahe na may sukat na 28x28 pixels.\n",
"Ang lahat ng mga numero ay kinakatawan ng grayscale na mga imahe na may sukat na 28x28 pixels.\n",
"\n",
"> Ang MNIST Dataset ay makukuha bilang isang training competition sa [Kaggle](https://www.kaggle.com/c/digit-recognizer), isang site na nagho-host ng mga kumpetisyon at paligsahan sa machine learning. Kapag natutunan mo kung paano i-classify ang MNIST digits, maaari mong isumite ang iyong solusyon sa Kaggle upang makita kung paano ito niraranggo kumpara sa ibang mga kalahok.\n",
"> Ang MNIST Dataset ay magagamit bilang isang training competition sa [Kaggle](https://www.kaggle.com/c/digit-recognizer), isang site na nagho-host ng mga kumpetisyon at paligsahan sa machine learning. Kapag natutunan mo kung paano i-classify ang MNIST digits, maaari mong isumite ang iyong solusyon sa Kaggle upang makita kung paano ito niraranggo kumpara sa ibang mga kalahok.\n",
"\n",
"Magsisimula tayo sa pag-load ng MNIST dataset:\n"
]
@ -642,7 +644,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Ngayon, i-plot na natin ang dataset:\n"
"Ngayon, i-plot natin ang dataset:\n"
]
},
{
@ -693,7 +695,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Dahil ang perceptron ay isang binary classifier, lilimitahan natin ang ating problema sa pagkilala ng dalawang numero lamang. Ang function sa ibaba ay pupunan ang mga positibo at negatibong sample array gamit ang dalawang ibinigay na numero (at ipapakita rin ang mga sample ng mga numerong iyon para sa kalinawan).\n"
"Dahil ang perceptron ay isang binary classifier, lilimitahan natin ang ating problema sa pagkilala ng dalawang numero lamang. Ang function sa ibaba ay magpupuno ng positibo at negatibong sample arrays gamit ang dalawang ibinigay na numero (at ipapakita rin ang mga sample ng mga numerong iyon para sa kalinawan).\n"
]
},
{
@ -732,7 +734,9 @@
{
"cell_type": "markdown",
"metadata": {},
"source": []
"source": [
"Magsisimula tayo sa pagsubok na mag-uri sa pagitan ng 0 at 1:\n"
]
},
{
"cell_type": "code",
@ -827,11 +831,11 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Pakitandaan kung paano mabilis na tumataas ang katumpakan hanggang halos 100%.\n",
"Pakitandaan na ang katumpakan ay mabilis na tumataas hanggang halos 100%.\n",
"\n",
"Pakiusog ang slider sa isang posisyon malapit sa dulo ng pagsasanay, at obserbahan ang weight matrix na ipinapakita sa kaliwa. Ang matrix na ito ay magpapahintulot sa iyo na maunawaan kung paano talaga gumagana ang perceptron. Makikita mo ang mataas na halaga ng timbang sa gitna ng field, na tumutugma sa mga pixel na karaniwang naroroon para sa digit na 1, at mababang negatibong halaga sa mga gilid, kung saan matatagpuan ang mga bahagi ng digit na 0. Kaya, kung ang digit na ipinakita sa perceptron ay talagang 1, ang gitnang bahagi nito ay mumultiplika sa mataas na halaga, na magreresulta sa positibong resulta. Sa kabaligtaran, kapag ang perceptron ay nakakita ng 0, ang mga kaukulang pixel ay mumultiplika sa mga negatibong numero.\n",
"Pakiusog ang slider sa isang posisyon malapit sa dulo ng pagsasanay, at obserbahan ang weight matrix na ipinapakita sa kaliwa. Ang matrix na ito ay magbibigay-daan sa iyo na maunawaan kung paano talaga gumagana ang perceptron. Makikita mo ang mataas na halaga ng timbang sa gitna ng field, na tumutugma sa mga pixel na karaniwang naroroon para sa digit na 1, at mababang negatibong halaga sa mga gilid, kung saan naroroon ang mga bahagi ng digit na 0. Kaya, kung ang digit na ipinakita sa perceptron ay talagang 1, ang gitnang bahagi nito ay mamumultiply sa mataas na halaga, na magreresulta sa positibong output. Sa kabaligtaran, kapag ang perceptron ay nakakita ng 0, ang mga kaukulang pixel ay mamumultiply sa mga negatibong numero.\n",
"\n",
"> Mapapansin mo na kung bibigyan natin ang ating perceptron ng digit na 1 na bahagyang nausog nang pahalang, kaya't ang mga pixel nito ay sumasakop sa lugar kung saan naroroon ang mga patayong bahagi ng 0, maaari tayong makakuha ng maling resulta. Dahil ang kalikasan ng ating MNIST dataset ay ang lahat ng mga digit ay nakasentro at maayos ang pagkakaposisyon, at ang perceptron ay umaasa dito upang makilala ang mga digit.\n",
"> Mapapansin mo na kung bibigyan natin ang ating perceptron ng digit na 1 na bahagyang na-shift nang pahalang, kaya ang mga pixel nito ay sumasakop sa lugar kung saan naroroon ang mga vertical na bahagi ng 0, maaari tayong makakuha ng maling resulta. Dahil ang likas na katangian ng ating MNIST dataset ay ang lahat ng mga digit ay nakasentro at maayos ang posisyon, at ang perceptron ay umaasa dito upang makilala ang mga digit.\n",
"\n",
"Ngayon, subukan natin ang iba't ibang mga digit:\n"
]
@ -909,11 +913,11 @@
"source": [
"## Talakayan\n",
"\n",
"Sa ilang kadahilanan, hindi madaling paghiwalayin ang 2 at 5. Kahit na nakakakuha tayo ng medyo mataas na accuracy (higit sa 85%), malinaw na makikita kung paano humihinto ang perceptron sa pagkatuto sa isang punto.\n",
"Sa ilang kadahilanan, ang 2 at 5 ay hindi madaling maihiwalay. Kahit na nakakakuha tayo ng medyo mataas na accuracy (higit sa 85%), malinaw nating nakikita kung paano humihinto ang perceptron sa pag-aaral sa isang punto.\n",
"\n",
"Upang maunawaan kung bakit ito nangyayari, maaari nating subukang gumamit ng [Principal Component Analysis](https://en.wikipedia.org/wiki/Principal_component_analysis) (PCA). Isa itong teknik sa machine learning na ginagamit upang bawasan ang dimensionality ng input dataset, sa paraang makakamit ang pinakamainam na pagkakahiwalay ng mga klase.\n",
"Upang maunawaan kung bakit ito nangyayari, maaari nating subukang gumamit ng [Principal Component Analysis](https://en.wikipedia.org/wiki/Principal_component_analysis) (PCA). Isa itong teknik sa machine learning na ginagamit upang bawasan ang dimensionality ng input dataset, sa paraang makuha ang pinakamainam na paghihiwalay sa pagitan ng mga klase.\n",
"\n",
"Sa ating kaso, ang isang input na imahe ay may 784 pixels (mga input feature), at nais nating gamitin ang PCA upang bawasan ang bilang ng mga parameter sa dalawa lamang, upang maipakita natin ito sa graph. Ang dalawang parameter na ito ay magiging linear na kombinasyon ng mga orihinal na feature, at maaari nating tingnan ang prosesong ito bilang \"pag-ikot\" ng ating orihinal na 784-dimensional na espasyo at pagmasdan ang projection nito sa ating 2D-space, hanggang sa makuha natin ang pinakamainam na view na naghihiwalay sa mga klase.\n"
"Sa ating kaso, ang isang input na imahe ay may 784 pixels (input features), at nais nating gamitin ang PCA upang bawasan ang bilang ng mga parameter sa dalawa lamang, upang maipakita natin ang mga ito sa graph. Ang dalawang parameter na ito ay magiging linear na kombinasyon ng mga orihinal na features, at maaari nating tingnan ang prosesong ito bilang \"pag-ikot\" ng ating orihinal na 784-dimensional na espasyo at pag-obserba sa projection nito sa ating 2D-space, hanggang makuha natin ang pinakamainam na view na naghihiwalay sa mga klase.\n"
]
},
{
@ -1023,16 +1027,16 @@
}
},
"source": [
"Tulad ng nakikita, ang 0 at 1 ay maaaring malinaw na paghiwalayin gamit ang isang tuwid na linya. Ipinapakita nito na sa orihinal na 784-dimensional na espasyo, ang mga tuldok na tumutukoy sa mga digit ay maaari ring paghiwalayin nang linear. Sa kaso ng 2 at 5, hindi natin mahanap ang tamang projection na maghihiwalay nang malinaw sa mga digit, kaya't may ilang pagkakataon ng maling klasipikasyon.\n",
"Tulad ng nakikita mo, ang 0 at 1 ay maaaring malinaw na paghiwalayin gamit ang isang tuwid na linya. Ipinapakita nito na sa orihinal na 784-dimensional na espasyo, ang mga tuldok na tumutukoy sa mga digit ay linearly separable din. Sa kaso ng 2 at 5, hindi natin mahanap ang tamang projection na maghihiwalay nang malinaw sa mga digit, kaya may ilang pagkakataon ng maling klasipikasyon.\n",
"\n",
"> Sa susunod na bahagi ng kursong ito, matututuhan natin kung paano gumawa ng mga non-linear na classifier gamit ang Neural Networks, at kung paano harapin ang problema ng mga digit na hindi maayos na naka-align. Hindi magtatagal, maaabot natin ang higit sa 99% na accuracy sa MNIST digit classification, habang ikinuklasipika ang mga ito sa 10 iba't ibang klase.\n",
"> Sa susunod na bahagi ng kursong ito, matututunan natin kung paano gumawa ng mga non-linear classifier gamit ang Neural Networks, at kung paano harapin ang problema ng mga digit na hindi maayos na naka-align. Hindi magtatagal, maaabot natin ang higit sa 99% na accuracy sa MNIST digit classification, habang ikinuklasipika ang mga ito sa 10 iba't ibang klase.\n",
"\n",
"## Mga Mahalagang Punto\n",
"\n",
" * Natutunan natin ang pinakasimpleng arkitektura ng neural network - ang one-layer perceptron.\n",
" * Naipatupad natin ang perceptron \"sa pamamagitan ng kamay,\" gamit ang simpleng proseso ng pagsasanay na nakabatay sa gradient descent.\n",
" * Sa kabila ng pagiging simple, ang one-layered perceptron ay kayang lutasin ang medyo komplikadong problema ng pagkilala sa mga sulat-kamay na digit.\n",
" * Ang one-layered perceptron ay isang linear classifier, kaya't nagbibigay ito ng parehong kakayahan sa klasipikasyon tulad ng logistic regression.\n",
" * Ang one-layered perceptron ay isang linear classifier, kaya nagbibigay ito ng parehong kakayahan sa klasipikasyon tulad ng logistic regression.\n",
" * Sa sample space, kayang paghiwalayin ng perceptron ang dalawang klase ng input data gamit ang hyperplane.\n"
]
},
@ -1042,14 +1046,14 @@
"source": [
"## Mga Kredito\n",
"\n",
"Ang notebook na ito ay bahagi ng [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners), at inihanda ni [Dmitry Soshnikov](http://soshnikov.com). Ito ay inspirasyon mula sa Neural Network Workshop sa Microsoft Research Cambridge. Ang ilang code at mga materyal na pang-illustrasyon ay kinuha mula sa mga presentasyon nina [Katja Hoffmann](https://www.microsoft.com/en-us/research/people/kahofman/), [Matthew Johnson](https://www.microsoft.com/en-us/research/people/matjoh/) at [Ryoto Tomioka](https://www.microsoft.com/en-us/research/people/ryoto/), at mula sa repository ng [NeuroWorkshop](http://github.com/shwars/NeuroWorkshop).\n"
"Ang notebook na ito ay bahagi ng [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners), at inihanda ni [Dmitry Soshnikov](http://soshnikov.com). Ito ay inspirasyon mula sa Neural Network Workshop sa Microsoft Research Cambridge. Ang ilang code at mga materyal na pang-illustrasyon ay kinuha mula sa mga presentasyon nina [Katja Hoffmann](https://www.microsoft.com/en-us/research/people/kahofman/), [Matthew Johnson](https://www.microsoft.com/en-us/research/people/matjoh/) at [Ryoto Tomioka](https://www.microsoft.com/en-us/research/people/ryoto/), at mula sa repositoryong [NeuroWorkshop](http://github.com/shwars/NeuroWorkshop).\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Paunawa**: \nAng dokumentong ito ay isinalin gamit ang AI translation service na [Co-op Translator](https://github.com/Azure/co-op-translator). Bagama't sinisikap naming maging tumpak, pakitandaan na ang mga awtomatikong pagsasalin ay maaaring maglaman ng mga pagkakamali o hindi pagkakatugma. Ang orihinal na dokumento sa orihinal nitong wika ang dapat ituring na opisyal na sanggunian. Para sa mahalagang impormasyon, inirerekomenda ang propesyonal na pagsasalin ng tao. Hindi kami mananagot sa anumang hindi pagkakaunawaan o maling interpretasyon na maaaring magmula sa paggamit ng pagsasaling ito.\n"
"\n---\n\n**Paunawa**: \nAng dokumentong ito ay isinalin gamit ang AI translation service na [Co-op Translator](https://github.com/Azure/co-op-translator). Bagama't sinisikap naming maging tumpak, mangyaring tandaan na ang mga awtomatikong pagsasalin ay maaaring maglaman ng mga pagkakamali o hindi pagkakatugma. Ang orihinal na dokumento sa kanyang katutubong wika ang dapat ituring na opisyal na sanggunian. Para sa mahalagang impormasyon, inirerekomenda ang propesyonal na pagsasalin ng tao. Hindi kami mananagot sa anumang hindi pagkakaunawaan o maling interpretasyon na dulot ng paggamit ng pagsasaling ito.\n"
]
}
],
@ -1078,8 +1082,8 @@
"start_slideshow_at": "selected"
},
"coopTranslator": {
"original_hash": "914fc55f59efc7e17b8130d4033ac617",
"translation_date": "2025-08-29T06:44:32+00:00",
"original_hash": "d67e5b54ba20b507aa88d71aa3d042d8",
"translation_date": "2025-10-03T13:37:49+00:00",
"source_file": "lessons/3-NeuralNetworks/03-Perceptron/Perceptron.ipynb",
"language_code": "tl"
}

View File

@ -11,11 +11,11 @@
"source": [
"## Perceptron\n",
"\n",
"> Bu not defteri [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners) programının bir parçasıdır. Tam öğrenim materyalleri seti için depoyu ziyaret edin.\n",
"> Bu not defteri, [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners) programının bir parçasıdır. Tam öğrenim materyalleri seti için depoyu ziyaret edin.\n",
"\n",
"Daha önce tartıştığımız gibi, perceptron **ikili sınıflandırma problemini** çözmenize olanak tanır, yani giriş örneklerini iki sınıfa ayırabilirsiniz - bunlara **pozitif** ve **negatif** diyebiliriz.\n",
"\n",
"Öncelikle, gerekli bazı kütüphaneleri içe aktaralım.\n"
"Öncelikle, bazı gerekli kütüphaneleri içe aktaralım.\n"
]
},
{
@ -51,7 +51,7 @@
"\n",
"Başlangıç olarak, iki giriş özelliğine sahip bir oyuncak problemle başlayalım. Örneğin, tıpta tümörleri boyutuna ve yaşına bağlı olarak iyi huylu ve kötü huylu olarak sınıflandırmak isteyebiliriz.\n",
"\n",
"SciKit Learn kütüphanesindeki `make_classification` fonksiyonunu kullanarak rastgele bir sınıflandırma veri seti oluşturacağız:\n"
"SciKit Learn kütüphanesinden `make_classification` fonksiyonunu kullanarak rastgele bir sınıflandırma veri seti oluşturacağız:\n"
]
},
{
@ -95,7 +95,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Hadi veri setini de görselleştirelim:\n"
"Hadi veri setini de çizelim:\n"
]
},
{
@ -166,7 +166,7 @@
" \\end{cases} \\\\\n",
"$$\n",
"\n",
"Ancak, genel bir doğrusal modelin aynı zamanda bir bias terimi de olmalıdır, yani ideal olarak $y$'yi $y=f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}+\\mathbf{b})$ olarak hesaplamalıyız. Modelimizi basitleştirmek için, giriş özelliklerimize her zaman 1'e eşit olan bir boyut daha ekleyerek bu bias teriminden kurtulabiliriz:\n"
"Ancak, genel bir doğrusal modelin bir de bias terimi olmalıdır, yani ideal olarak $y$'yi $y=f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}+\\mathbf{b})$ olarak hesaplamalıyız. Modelimizi basitleştirmek için, giriş özelliklerimize her zaman 1'e eşit olan bir boyut ekleyerek bu bias teriminden kurtulabiliriz:\n"
]
},
{
@ -213,7 +213,7 @@
" * $t_{n} \\in \\{-1, +1\\}$ negatif ve pozitif eğitim örnekleri için sırasıyla\n",
" * $\\mathcal{M}$ - yanlış sınıflandırılmış örneklerin kümesi\n",
" \n",
"**Gradyan inişi** yöntemini kullanacağız. Başlangıçta rastgele bir $\\mathbf{w}^{(0)}$ ırlık setiyle başlayarak, her eğitim adımında $E$'nin gradyanını kullanarak ağırlıkları ayarlayacağız:\n",
"**Gradient descent** (gradyan inişi) yöntemini kullanacağız. Başlangıçta rastgele bir ırlık seti $\\mathbf{w}^{(0)}$ ile başlayarak, her eğitim adımında $E$'nin gradyanını kullanarak ağırlıkları ayarlayacağız:\n",
"\n",
"$$\\mathbf{w}^{\\tau + 1}=\\mathbf{w}^{\\tau} - \\eta \\nabla E(\\mathbf{w}) = \\mathbf{w}^{\\tau} + \\eta\\sum_{n \\in \\mathcal{M}}\\mathbf{x}_{n} t_{n}$$\n",
"\n",
@ -271,7 +271,9 @@
{
"cell_type": "markdown",
"metadata": {},
"source": []
"source": [
"Şimdi veri setimiz üzerinde eğitimi çalıştıralım:\n"
]
},
{
"cell_type": "code",
@ -309,9 +311,9 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Başlangıçta doğruluk oranı yaklaşık %50 civarındadır, ancak hızla %90'a yakın daha yüksek değerlere ulaşır.\n",
"Gördüğünüz gibi, başlangıç doğruluğu yaklaşık %50 civarında, ancak hızla %90'a yakın daha yüksek değerlere çıkıyor.\n",
"\n",
"Hadi sınıfların nasıl ayrıldığını görselleştirelim. Sınıflandırma fonksiyonumuz $\\mathbf{w}^Tx$ şeklindedir ve bir sınıf için 0'dan büyük, diğer sınıf için 0'dan küçüktür. Dolayısıyla, sınıf ayırma çizgisi $\\mathbf{w}^Tx = 0$ ile tanımlanır. Sadece iki boyutumuz olduğu için ($x_0$ ve $x_1$), çizgi için denklem $w_0x_0+w_1x_1+w_2 = 0$ olacaktır (ekstra bir boyut olan $x_2=1$'i açıkça tanımladığımızı unutmayın). Şimdi bu çizgiyi çizelim:\n"
"Şimdi sınıfların nasıl ayrıldığını görselleştirelim. Sınıflandırma fonksiyonumuz $\\mathbf{w}^Tx$ şeklindedir ve bir sınıf için 0'dan büyük, diğer sınıf için 0'dan küçüktür. Bu nedenle, sınıf ayırma çizgisi $\\mathbf{w}^Tx = 0$ ile tanımlanır. Sadece iki boyutumuz olduğu için ($x_0$ ve $x_1$), çizgi için denklem $w_0x_0+w_1x_1+w_2 = 0$ olur (ekstra bir boyut olan $x_2=1$'i açıkça tanımladığımızı unutmayın). Şimdi bu çizgiyi çizelim:\n"
]
},
{
@ -377,9 +379,9 @@
}
},
"source": [
"## Test Veri Seti Üzerinde Değerlendirme\n",
"## Test Veri Setinde Değerlendirme\n",
"\n",
"Başlangıçta, test veri seti için bir miktar veri ayırdık. Şimdi sınıflandırıcımızın bu test veri seti üzerindeki doğruluğunu inceleyelim. Bunu yapmak için, test veri setini ekstra bir boyutla genişletiyoruz, ağırlık matrisini çarpıyoruz ve elde edilen değerin etiketle (+1 veya -1) aynı işarete sahip olduğundan emin oluyoruz. Daha sonra tüm boolean değerlerini topluyor ve test örneğinin uzunluğuna bölerek doğruluğu elde ediyoruz:\n"
"Başlangıçta, test veri seti için bir miktar veri ayırmıştık. Şimdi sınıflandırıcımızın bu test veri setindeki doğruluğunu görelim. Bunu yapmak için, test veri setini ekstra bir boyutla genişletiyoruz, ağırlıklar matrisini çarpıyoruz ve elde edilen değerin etiketle aynı işarete sahip olduğundan (+1 veya -1) emin oluyoruz. Daha sonra tüm boolean değerlerini topluyor ve test örneğinin uzunluğuna bölerek doğruluğu elde ediyoruz:\n"
]
},
{
@ -420,7 +422,7 @@
"source": [
"## Eğitim sürecini gözlemleme\n",
"\n",
"Daha önce, eğitim sırasında doğruluğun nasıl azaldığını görmüştük. Eğitim sırasında ayrım çizgisinin nasıl davrandığını görmek güzel olurdu. Aşağıdaki kod, her şeyi tek bir grafikte görselleştirecek ve kaydırıcıyı hareket ettirerek eğitim sürecinde \"zaman yolculuğu\" yapabileceksiniz.\n"
"Daha önce eğitim sırasında doğruluğun nasıl azaldığını görmüştük. Eğitim sırasında ayrım çizgisinin nasıl davrandığını görmek güzel olurdu. Aşağıdaki kod, her şeyi tek bir grafikte görselleştirecek ve eğitim sürecinde \"zaman yolculuğu\" yapmak için kaydırıcıyı hareket ettirebilmelisiniz.\n"
]
},
{
@ -527,9 +529,9 @@
"source": [
"## Perceptron'un Sınırlamaları\n",
"\n",
"Yukarıda gördüğünüz gibi, perceptron bir **doğrusal sınıflandırıcıdır**. Eğer iki sınıf **doğrusal olarak ayrılabilir**, yani düz bir çizgiyle ayrılabiliyorsa, perceptron bu sınıfları iyi bir şekilde ayırt edebilir. Aksi takdirde, perceptron'un eğitim süreci sonuca ulaşamaz.\n",
"Yukarıda gördüğünüz gibi, perceptron bir **doğrusal sınıflandırıcıdır**. Eğer iki sınıf **doğrusal olarak ayrılabilir**, yani düz bir çizgi ile ayrılabiliyorsa, perceptron bu sınıfları iyi bir şekilde ayırt edebilir. Aksi takdirde, perceptron'un eğitim süreci sonuca ulaşamaz.\n",
"\n",
"Perceptron ile çözülemeyen bir probleme en bariz örnek, **XOR problemi** olarak adlandırılan durumdur. Perceptron'un, aşağıdaki doğruluk tablosuna sahip olan XOR mantıksal fonksiyonunu öğrenmesini istiyoruz:\n",
"Perceptron'un çözemeyeceği bir probleme en bariz örnek, **XOR problemi** olarak adlandırılan durumdur. Perceptron'un XOR mantıksal fonksiyonunu öğrenmesini istiyoruz. Bu fonksiyonun doğruluk tablosu şu şekildedir:\n",
"\n",
"| | 0 | 1 |\n",
"|---|---|---|\n",
@ -603,17 +605,17 @@
}
},
"source": [
"Yukarıdaki grafikten de görebileceğiniz gibi, doğruluk oranı hiçbir zaman %75'in üzerine çıkmaz, çünkü tüm olası örnekleri doğru şekilde kapsayacak bir düz çizgi çizmek imkansızdır.\n",
"Yukarıdaki grafikten de görebileceğiniz gibi, doğruluk hiçbir zaman %75'in üzerine çıkmaz, çünkü tüm örnekleri doğru şekilde sınıflandıracak bir doğru çizmek mümkün değildir.\n",
"\n",
"XOR problemi, algılayıcıların sınırlamalarına klasik bir örnektir ve 1969 yılında Marvin Minsky ve Seymour Papert tarafından [Perceptrons](https://en.wikipedia.org/wiki/Perceptrons_(book)) adlı kitaplarında dile getirilmiştir. Bu gözlem, sinir ağları alanındaki araştırmaları neredeyse 10 yıl boyunca sınırlamıştır, ancak - ve bunu kursumuzun bir sonraki bölümünde göreceğiz - çok katmanlı algılayıcılar bu tür problemleri çözme kapasitesine sahiptir.\n",
"XOR problemi, algılayıcıların sınırlamalarına klasik bir örnektir ve 1969 yılında Marvin Minsky ve Seymour Papert tarafından [Perceptrons](https://en.wikipedia.org/wiki/Perceptrons_(book)) adlı kitaplarında dile getirilmiştir. Bu gözlem, nöral ağlar alanındaki araştırmaları neredeyse 10 yıl boyunca sınırlamıştır. Ancak - bunu kursumuzun bir sonraki bölümünde göreceğiz - çok katmanlı algılayıcılar bu tür problemleri çözme kapasitesine sahiptir.\n",
"\n",
"## Karmaşık Örnek - MNIST\n",
"\n",
"Algılayıcı XOR problemini çözemese de, el yazısı karakter tanıma gibi çok daha karmaşık problemleri çözebilir.\n",
"\n",
"Makine öğrenimini öğrenirken sıkça kullanılan bir veri seti [MNIST](https://en.wikipedia.org/wiki/MNIST_database) olarak adlandırılır. Bu veri seti, Ulusal Standartlar ve Teknoloji Enstitüsü tarafından değiştirilerek oluşturulmuştur ve enstitüdeki yaklaşık 250 öğrenci ve çalışan tarafından yazılmış 60000 el yazısı rakamdan oluşan bir eğitim seti içerir. Ayrıca, farklı bireylerden toplanmış 10000 rakamdan oluşan bir test veri seti de bulunmaktadır.\n",
"Makine öğrenimini öğrenirken sıkça kullanılan bir veri seti [MNIST](https://en.wikipedia.org/wiki/MNIST_database) olarak adlandırılır. Bu veri seti, Ulusal Standartlar ve Teknoloji Enstitüsü tarafından oluşturulmuş ve 60000 el yazısı rakamdan oluşan bir eğitim seti içerir. Bu rakamlar, enstitünün yaklaşık 250 öğrenci ve çalışanından toplanmıştır. Ayrıca, farklı bireylerden toplanmış 10000 rakamdan oluşan bir test veri seti de bulunmaktadır.\n",
"\n",
"Tüm rakamlar, 28x28 piksel boyutunda gri tonlamalı görüntülerle temsil edilir.\n",
"Tüm rakamlar, 28x28 piksel boyutunda gri tonlamalı görüntülerle temsil edilmektedir.\n",
"\n",
"> MNIST Veri Seti, makine öğrenimi yarışmalarına ve yarışmalarına ev sahipliği yapan bir site olan [Kaggle](https://www.kaggle.com/c/digit-recognizer) üzerinde bir eğitim yarışması olarak mevcuttur. MNIST rakamlarını nasıl sınıflandıracağınızı öğrendikten sonra, çözümünüzü Kaggle'a göndererek diğer katılımcılar arasında nasıl değerlendirildiğini görebilirsiniz.\n",
"\n",
@ -693,7 +695,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Perceptron bir ikili sınıflandırıcı olduğu için, problemimizi yalnızca iki rakamı tanımakla sınırlayacağız. Aşağıdaki fonksiyon, verilen iki rakamla pozitif ve negatif örnek dizilerini dolduracak (ve açıklık sağlamak için bu rakamların örneklerini de gösterecektir).\n"
"Perceptron bir ikili sınıflandırıcı olduğu için, problemimizi yalnızca iki rakamı tanımayla sınırlandıracağız. Aşağıdaki fonksiyon, verilen iki rakamla pozitif ve negatif örnek dizilerini dolduracak (ve açıklık sağlamak için bu rakamların örneklerini gösterecektir).\n"
]
},
{
@ -831,9 +833,9 @@
"source": [
"Lütfen, doğruluğun çok hızlı bir şekilde neredeyse %100'e çıktığını fark edin.\n",
"\n",
"Lütfen, eğitimin sonuna doğru bir noktaya kaydırıcıyı hareket ettirin ve solda çizilen ağırlık matrisini gözlemleyin. Bu matris, perceptronun nasıl çalıştığını anlamanıza yardımcı olacaktır. Alanın ortasındaki yüksek ağırlık değerlerini görebilirsiniz; bunlar genellikle 1 rakamı için mevcut olan piksellere karşılık gelir. Yanlardaki düşük negatif değerler ise 0 rakamının parçalarının bulunduğu yerlere karşılık gelir. Dolayısıyla, perceptrona sunulan rakam gerçekten 1 ise, orta kısmı yüksek değerlerle çarpılacak ve pozitif bir sonuç üretecektir. Aksine, perceptron 0'ı gözlemlediğinde, ilgili pikseller negatif sayılarla çarpılacaktır.\n",
"Eğitimin sonuna doğru bir noktaya kaydırıcıyı hareket ettirin ve sol tarafta çizilen ağırlık matrisini gözlemleyin. Bu matris, perceptronun nasıl çalıştığını anlamanızı sağlayacaktır. Alanın ortasında genellikle 1 rakamı için mevcut olan piksellere karşılık gelen yüksek ağırlık değerlerini ve 0 rakamının parçalarının bulunduğu kenarlarda düşük negatif değerleri görebilirsiniz. Dolayısıyla, perceptrona sunulan rakam gerçekten 1 ise, orta kısmı yüksek değerlerle çarpılacak ve pozitif bir sonuç üretecektir. Buna karşılık, perceptron 0 rakamını gözlemlediğinde, ilgili pikseller negatif sayılarla çarpılacaktır.\n",
"\n",
"> Perceptrona yatay olarak hafifçe kaydırılmış bir 1 rakamı verirsek, pikselleri 0'ın dikey parçalarının bulunduğu yere denk gelirse, yanlış bir sonuç alabileceğimizi fark edebilirsiniz. MNIST veri setimizin doğası gereği, tüm rakamlar merkezlenmiş ve düzgün bir şekilde konumlandırılmıştır ve perceptron, rakamları ayırt etmek için buna güvenir.\n",
"> Perceptrona yatay olarak hafifçe kaydırılmış bir 1 rakamı verirsek, pikselleri 0'ın dikey parçalarının bulunduğu yere denk gelirse, yanlış bir sonuç alabileceğimizi fark edebilirsiniz. MNIST veri setimizin doğası gereği tüm rakamlar merkezlenmiş ve düzgün bir şekilde konumlandırılmıştır ve perceptron, rakamları ayırt etmek için buna güvenir.\n",
"\n",
"Şimdi farklı rakamları deneyelim:\n"
]
@ -911,11 +913,11 @@
"source": [
"## Tartışma\n",
"\n",
"Bazı nedenlerden dolayı, 2 ve 5 birbirinden kolayca ayrılabilir değil. Her ne kadar nispeten yüksek doğruluk (yüzde 85'in üzerinde) elde etsek de, algılayıcının bir noktada öğrenmeyi durdurduğunu açıkça görebiliyoruz.\n",
"Bazı nedenlerden dolayı, 2 ve 5 rakamları kolayca ayrıştırılamıyor. Her ne kadar nispeten yüksek bir doğruluk oranı (yüzde 85'in üzerinde) elde etsek de, perceptron'un bir noktada öğrenmeyi durdurduğunu açıkça görebiliyoruz.\n",
"\n",
"Bu durumun neden olduğunu anlamak için [Temel Bileşen Analizi](https://en.wikipedia.org/wiki/Principal_component_analysis) (PCA) kullanmayı deneyebiliriz. PCA, sınıflar arasındaki en iyi ayrımı elde etmek amacıyla giriş veri setinin boyutunu düşürmek için kullanılan bir makine öğrenimi tekniğidir.\n",
"Bu durumun nedenini anlamak için [Temel Bileşen Analizi](https://en.wikipedia.org/wiki/Principal_component_analysis) (PCA) yöntemini kullanmayı deneyebiliriz. PCA, giriş veri kümesinin boyutunu azaltmak için kullanılan bir makine öğrenimi tekniğidir ve sınıflar arasındaki en iyi ayrımı elde etmeyi amaçlar.\n",
"\n",
"Bizim durumumuzda, bir giriş görüntüsü 784 piksel (giriş özellikleri) içeriyor ve PCA'yı kullanarak parametre sayısını sadece 2'ye düşürmek istiyoruz, böylece bunları grafikte çizebiliriz. Bu iki parametre, orijinal özelliklerin lineer bir kombinasyonu olacaktır ve bu işlemi, orijinal 784 boyutlu uzayımızı \"döndürmek\" ve sınıfları en iyi şekilde ayıran görünümü elde edene kadar 2 boyutlu uzayımıza projeksiyonunu gözlemlemek olarak düşünebiliriz.\n"
"Bizim durumumuzda, bir giriş görüntüsü 784 pikselden (giriş özellikleri) oluşuyor ve PCA'yı kullanarak parametre sayısını sadece 2'ye düşürmek istiyoruz, böylece bunları bir grafikte görselleştirebiliriz. Bu iki parametre, orijinal özelliklerin doğrusal bir kombinasyonu olacaktır ve bu işlemi, orijinal 784 boyutlu uzayımızı \"döndürmek\" ve sınıfları en iyi şekilde ayıran 2 boyutlu uzaydaki projeksiyonunu gözlemlemek olarak düşünebiliriz.\n"
]
},
{
@ -1025,17 +1027,17 @@
}
},
"source": [
"0 ve 1'in düz bir çizgiyle açıkça ayrılabildiğini görebilirsiniz. Bu, orijinal 784 boyutlu uzayda rakamlara karşılık gelen noktaların da doğrusal olarak ayrılabilir olduğunu gösterir. Ancak 2 ve 5 durumunda, rakamları net bir şekilde ayıracak iyi bir projeksiyon bulamayız ve bu nedenle bazı yanlış sınıflandırma durumları ortaya çıkar.\n",
"Gördüğünüz gibi, 0 ve 1 bir doğru ile açıkça ayrılabiliyor. Bu, orijinal 784 boyutlu uzayda rakamlara karşılık gelen noktaların da doğrusal olarak ayrılabilir olduğunu gösteriyor. Ancak 2 ve 5 durumunda, rakamları net bir şekilde ayıracak iyi bir projeksiyon bulamıyoruz ve bu nedenle bazı yanlış sınıflandırma durumları ortaya çıkıyor.\n",
"\n",
"> Bu kursun ilerleyen bölümlerinde, Sinir Ağları kullanarak doğrusal olmayan sınıflandırıcılar oluşturmayı ve rakamların düzgün hizalanmaması sorunuyla başa çıkmayı öğreneceğiz. Çok yakında MNIST rakam sınıflandırmasında %99'un üzerinde doğruluğa ulaşacağız ve rakamları 10 farklı sınıfa ayıracağız.\n",
"> Bu kursun ilerleyen bölümlerinde, Neural Networks kullanarak doğrusal olmayan sınıflandırıcılar oluşturmayı ve rakamların düzgün hizalanmaması sorunuyla başa çıkmayı öğreneceğiz. Çok yakında MNIST rakam sınıflandırmasında %99'un üzerinde doğruluğa ulaşacağız ve rakamları 10 farklı sınıfa ayıracağız.\n",
"\n",
"## Özet\n",
"\n",
" * En basit sinir ağı mimarisi olan tek katmanlı perceptron hakkında bilgi edindik.\n",
" * Perceptron'u \"elle\" uyguladık, basit bir eğitim prosedürü kullanarak, gradyan inişi temelli.\n",
" * Perceptron'u \"elle\" basit bir eğitim prosedürü kullanarak, gradient descent yöntemiyle uyguladık.\n",
" * Basitliğine rağmen, tek katmanlı perceptron el yazısı rakam tanıma gibi oldukça karmaşık problemleri çözebilir.\n",
" * Tek katmanlı perceptron doğrusal bir sınıflandırıcıdır ve bu nedenle lojistik regresyon ile aynı sınıflandırma gücünü sağlar.\n",
" * Örnek uzayında, perceptron giriş verisinin iki sınıfını hiper düzlem kullanarak ayırabilir.\n"
" * Örnek uzayında, perceptron giriş verisinin iki sınıfını bir hiper düzlem kullanarak ayırabilir.\n"
]
},
{
@ -1051,7 +1053,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Feragatname**: \nBu belge, [Co-op Translator](https://github.com/Azure/co-op-translator) adlı yapay zeka çeviri hizmeti kullanılarak çevrilmiştir. Doğruluk için çaba göstersek de, otomatik çevirilerin hata veya yanlışlıklar içerebileceğini lütfen unutmayın. Belgenin orijinal dili, yetkili kaynak olarak kabul edilmelidir. Kritik bilgiler için profesyonel insan çevirisi önerilir. Bu çevirinin kullanımından kaynaklanan yanlış anlama veya yanlış yorumlamalardan sorumlu değiliz.\n"
"\n---\n\n**Feragatname**: \nBu belge, AI çeviri hizmeti [Co-op Translator](https://github.com/Azure/co-op-translator) kullanılarak çevrilmiştir. Doğruluğu sağlamak için çaba göstersek de, otomatik çevirilerin hata veya yanlışlık içerebileceğini lütfen unutmayın. Belgenin orijinal dili, yetkili kaynak olarak kabul edilmelidir. Kritik bilgiler için profesyonel insan çevirisi önerilir. Bu çevirinin kullanımından kaynaklanan yanlış anlamalar veya yanlış yorumlamalar için sorumluluk kabul edilmez.\n"
]
}
],
@ -1080,8 +1082,8 @@
"start_slideshow_at": "selected"
},
"coopTranslator": {
"original_hash": "914fc55f59efc7e17b8130d4033ac617",
"translation_date": "2025-08-29T08:24:55+00:00",
"original_hash": "d67e5b54ba20b507aa88d71aa3d042d8",
"translation_date": "2025-10-03T13:26:17+00:00",
"source_file": "lessons/3-NeuralNetworks/03-Perceptron/Perceptron.ipynb",
"language_code": "tr"
}

View File

@ -11,11 +11,11 @@
"source": [
"## 感知器\n",
"\n",
"> 筆記本是 [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners) 的一部分。請訪問該倉庫以獲取完整的學習資料。\n",
"> 筆記本是 [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners) 的一部分。請訪問該存儲庫以獲取完整的學習材料。\n",
"\n",
"如我們所討論的,感知器可以用來解決**二元分類問題**,也就是將輸入範例分類為兩個類別——我們可以稱之為**正類**和**負類**。\n",
"如我們所討論的,感知器可以幫助解決**二元分類問題**,也就是將輸入範例分類為兩個類別——我們可以稱它們為**正類**和**負類**。\n",
"\n",
"首先,讓我們匯入一些必要的函式庫。\n"
"首先,讓我們導入一些所需的庫。\n"
]
},
{
@ -49,7 +49,7 @@
"source": [
"## 玩具問題\n",
"\n",
"首先,我們從一個玩具問題開始,這個問題有兩個輸入特徵。例如,在醫學領域,我們可能希望根據腫瘤的大小和年齡將其分類為良性或惡性。\n",
"首先,我們從一個玩具問題開始,這個問題有兩個輸入特徵。例如,在醫學,我們可能希望根據腫瘤的大小和年齡將其分類為良性或惡性。\n",
"\n",
"我們將使用 SciKit Learn 庫中的 `make_classification` 函數生成一個隨機分類數據集:\n"
]
@ -166,7 +166,7 @@
" \\end{cases} \\\\\n",
"$$\n",
"\n",
"然而,一般的線性模型通常還需要一個偏項,也就是說,理想情況下我們應該計算 $y$ 為 $y=f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}+\\mathbf{b})$。為了簡化模型,我們可以通過在輸入特徵中添加一個始終等於 1 的維度來去除這個偏置項:\n"
"然而,一般的線性模型通常還需要一個偏項,也就是說,理想情況下我們應該計算 $y$ 為 $y=f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}+\\mathbf{b})$。為了簡化模型,我們可以通過在輸入特徵中添加一個始終等於 1 的維度來消除這個偏差項:\n"
]
},
{
@ -206,18 +206,18 @@
"source": [
"## 訓練算法\n",
"\n",
"為了訓練感知器,我們需要找到權重 $\\mathbf{w}$,以最小化錯誤。錯誤是使用**感知器準則**定義的:\n",
"為了訓練感知器,我們需要找到能夠最小化錯誤的權重 $\\mathbf{w}$。錯誤是使用**感知器準則**定義的:\n",
"\n",
"$$E(\\mathbf{w}) = -\\sum_{n \\in \\mathcal{M}}\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}_{n}t_{n}$$\n",
" \n",
" * $t_{n} \\in \\{-1, +1\\}$ 分別代表負樣本和正樣本\n",
" * $t_{n} \\in \\{-1, +1\\}$ 分別代表負樣本和正樣本的標籤\n",
" * $\\mathcal{M}$ - 錯誤分類的樣本集合\n",
" \n",
"我們將使用**梯度下降**的過程。從些初始隨機權重 $\\mathbf{w}^{(0)}$ 開始,我們會在訓練的每一步根據 $E$ 的梯度來調整權重:\n",
"我們將使用**梯度下降**的過程。從些初始隨機權重 $\\mathbf{w}^{(0)}$ 開始,我們會在訓練的每一步根據 $E$ 的梯度來調整權重:\n",
"\n",
"$$\\mathbf{w}^{\\tau + 1}=\\mathbf{w}^{\\tau} - \\eta \\nabla E(\\mathbf{w}) = \\mathbf{w}^{\\tau} + \\eta\\sum_{n \\in \\mathcal{M}}\\mathbf{x}_{n} t_{n}$$\n",
"\n",
"其中 $\\eta$ 是**學習率**$\\tau\\in\\mathbb{N}$ 是迭代次數。\n",
"其中 $\\eta$ 是**學習率**$\\tau\\in\\mathbb{N}$ 是迭代次數。\n",
"\n",
"以下是用 Python 定義此算法:\n"
]
@ -271,7 +271,9 @@
{
"cell_type": "markdown",
"metadata": {},
"source": []
"source": [
"現在讓我們在我們的數據集上進行訓練:\n"
]
},
{
"cell_type": "code",
@ -309,9 +311,9 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"如您所見,初始準確率約為 50%,但很快就提升至接近 90% 的高值。\n",
"如您所見,初始準確率約為 50%,但很快就提升到接近 90% 的較高值。\n",
"\n",
"讓我們來視覺化類別的分隔情況。我們的分類函數形式為 $\\mathbf{w}^Tx$,對於某一類別,其值大於 0對於另一類別,其值小於 0。因此類別分隔線由 $\\mathbf{w}^Tx = 0$ 定義。由於我們只有兩個維度 $x_0$ 和 $x_1$,該直線的方程式為 $w_0x_0+w_1x_1+w_2 = 0$(請記住,我們已明確定義了一個額外的維度 $x_2=1$)。現在讓我們繪製這條直線:\n"
"現在讓我們來視覺化類別的分隔情況。我們的分類函數形式為 $\\mathbf{w}^Tx$,對於某一類別,其值大於 0,而對於另一類別,其值小於 0。因此類別分隔線由 $\\mathbf{w}^Tx = 0$ 定義。由於我們只有兩個維度 $x_0$ 和 $x_1$,該直線的方程式為 $w_0x_0+w_1x_1+w_2 = 0$(請記住,我們已明確定義了一個額外的維度 $x_2=1$)。現在讓我們繪製這條直線:\n"
]
},
{
@ -379,7 +381,7 @@
"source": [
"## 在測試數據集上進行評估\n",
"\n",
"一開始,我們已經將部分數據分離出來作為測試數據集。現在來看看我們的分類器在這個測試數據集上的準確性如何。為了達到這個目的,我們需要擴展測試數據集,增加一個額外的維度,然後與權重矩陣相乘,並確保得到的值與標籤的符號一致(+1 或 -1。接著我們將所有布林值相加並除以測試樣本的長度計算出準確率:\n"
"一開始,我們已經將部分數據分離出來作為測試數據集。現在來看看我們的分類器在這個測試數據集上的準確性如何。為了做到這一點,我們需要將測試數據集擴展一個額外的維度,乘上權重矩陣,並確保得到的值與標籤的符號一致(+1 或 -1。接著我們將所有布林值相加並除以測試樣本的長度計算出準確率:\n"
]
},
{
@ -420,7 +422,7 @@
"source": [
"## 觀察訓練過程\n",
"\n",
"我們之前已經看到,準確率在訓練過程中會下降。能夠觀察分隔線在訓練過程中的變化會很有趣。以下的程式碼將把所有內容可視化在一個圖表上,您可以通過移動滑桿來「時光旅行」觀察整個訓練過程。\n"
"我們之前已經看到,準確率在訓練過程中會下降。能夠觀察分隔線在訓練過程中的變化會很有趣。以下的程式碼將把所有內容可視化在一個圖表上,您可以移動滑桿來「時光旅行」查看訓練過程中的變化。\n"
]
},
{
@ -527,16 +529,16 @@
"source": [
"## 感知器的限制\n",
"\n",
"如上所述,感知器是一種**線性分類器**。如果兩個類別是**線性可分**的,也就是可以用一條直線分開,那麼感知器可以很好地區分它們。否則,感知器的訓練過程將無法收斂。\n",
"如上所述,感知器是一種**線性分類器**。如果兩個類別是**線性可分**的,也就是可以用一條直線分開,那麼感知器可以很好地區分它們。否則,感知器的訓練過程將無法收斂。\n",
"\n",
"一個最明顯的例子是感知器無法解決的問題,即所謂的**XOR 問題**。我們希望感知器學習 XOR 布林函數,其真值表如下:\n",
"一個最明顯的例子是感知器無法解決的問題,即所謂的**XOR問題**。我們希望感知器學習 XOR 布林函數,其真值表如下:\n",
"\n",
"| | 0 | 1 |\n",
"|---|---|---|\n",
"| 0 | 0 | 1 | \n",
"| 1 | 1 | 0 |\n",
"\n",
"讓我們試試看!我們將手動填所有正樣本和負樣本,然後調用我們上面定義的訓練函數:\n"
"讓我們試試看!我們將手動填所有正樣本和負樣本,然後調用我們上面定義的訓練函數:\n"
]
},
{
@ -603,7 +605,7 @@
}
},
"source": [
"正如上圖所示,準確率永遠不會超過 75%,因為不可能畫出一條直線來正確分類所有可能的例子。\n",
"如上圖所示,準確率從未超過 75%,因為不可能畫出一條直線來正確分類所有可能的例子。\n",
"\n",
"XOR 問題是感知器局限性的經典例子,這一點在 1969 年由 Marvin Minsky 和 Seymour Papert 在他們的書籍 [Perceptrons](https://en.wikipedia.org/wiki/Perceptrons_(book)) 中指出。這一觀察限制了神經網絡領域的研究近 10 年,儘管——我們會在課程的下一部分看到——多層感知器完全有能力解決這類問題。\n",
"\n",
@ -611,7 +613,7 @@
"\n",
"儘管感知器無法解決 XOR 問題,但它可以解決許多更複雜的問題,例如手寫字符識別。\n",
"\n",
"在學習機器學習時,經常使用的一個數據集叫做 [MNIST](https://en.wikipedia.org/wiki/MNIST_database)。它由美國國家標準技術研究所Modified National Institute of Standards and Technology創建包含一個由 60000 個手寫數字組成的訓練集,這些數字來自研究所的約 250 名學生和員工。此外,還有一個由不同個體收集的 10000 個數字組成的測試數據集。\n",
"在學習機器學習時,經常使用的一個數據集叫做 [MNIST](https://en.wikipedia.org/wiki/MNIST_database)。它由美國國家標準與技術研究院Modified National Institute of Standards and Technology創建包含一個由 60000 個手寫數字組成的訓練集,這些數字來自該研究院約 250 名學生和員工。此外,還有一個由 10000 個手寫數字組成的測試數據集,這些數字來自不同的個體。\n",
"\n",
"所有數字都以 28x28 像素的灰度圖像表示。\n",
"\n",
@ -693,7 +695,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"因為感知器是一個二元分類器,我們將把問題限制為僅識別兩個數字。以下函數將使用兩個給定的數字填充正樣本和負樣本數組(並且還會顯示這些數字的樣本以便清楚)。\n"
"因為感知器是一個二元分類器,我們將把問題限制在只識別兩個數字。下面的函數將用兩個給定的數字填充正樣本和負樣本數組(並且也會顯示這些數字的樣本以便清楚)。\n"
]
},
{
@ -829,11 +831,11 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"請注意,準確度會非常快速地接近 100%。\n",
"請注意,準確率會非常快速地接近幾乎 100%。\n",
"\n",
"請將滑桿移動到訓練過程接近尾聲的位置,並觀察左側繪製的權重矩陣。這個矩陣可以幫助你理解感知器的實際工作原理。你可以看到矩陣中間部分的高權重值,這些值對應於通常出現在數字 1 中的像素;而矩陣兩側則有低的負值,這些位置通常是數字 0 的部分。因此,如果呈現給感知器的數字確實是 1中間部分的像素會與高權重值相乘產生正的結果。相反地當感知器觀察到數字 0 時,對應的像素會與負數相乘。\n",
"請將滑桿移動到訓練過程接近尾聲的位置,並觀察左側繪製的權重矩陣。這個矩陣可以幫助你理解感知器的實際運作方式。你可以看到矩陣中間的高權重值,這些值對應於通常出現在數字 1 中的像素;而矩陣兩側則是低的負值,這些位置通常是數字 0 的部分。因此,如果呈現給感知器的數字確實是 1中間部分的像素會與高權重值相乘產生正的結果。相反地當感知器觀察到數字 0時對應的像素會與負數相乘。\n",
"\n",
"> 你可能會注意到,如果我們給感知器一個數字 1並且稍微水平移動,使其像素佔據了數字 0 垂直部分的位置,我們可能會得到錯誤的結果。由於 MNIST 數據集的特性是所有數字都居中且定位正確,感知器依賴這一特性來區分數字。\n",
"> 你可能會注意到,如果我們給感知器一個數字 1並且稍微水平移動使其像素佔據了數字 0 垂直部分的位置,我們可能會得到錯誤的結果。由於 MNIST 數據集的特性是所有數字都居中且定位正確,感知器依賴這一特性來區分數字。\n",
"\n",
"現在讓我們嘗試不同的數字:\n"
]
@ -911,11 +913,11 @@
"source": [
"## 討論\n",
"\n",
"出於某些原因2 和 5 並不那麼容易分開。即使我們的準確率相對較高(超過 85%),我們仍然可以明顯看到感知器在某個時刻停止學習。\n",
"不知何故,數字 2 和 5 並不容易分開。即使我們的準確率相對較高(超過 85%),我們仍然可以明顯看到感知器在某個時刻停止學習。\n",
"\n",
"為了理解為什麼會發生這種情況,我們可以嘗試使用[主成分分析](https://en.wikipedia.org/wiki/Principal_component_analysis) (PCA)。這是一種機器學習技術,用於降低輸入數據集的維度,以便在類別之間獲得最佳的可分性。\n",
"為了理解為什麼會發生這種情況,我們可以嘗試使用[主成分分析](https://en.wikipedia.org/wiki/Principal_component_analysis) (PCA)。這是一種機器學習技術,用於降低輸入數據集的維度,以便獲得最佳的類別可分性。\n",
"\n",
"在我們的案例中,一張輸入圖片有 784 個像素(輸入特徵),我們希望使用 PCA 將參數數量減少到僅 2 個,這樣我們就可以在圖表上繪製它們。這兩個參數將是原始特徵的線性組合,我們可以將這個過程視為對原始 784 維空間進行“旋轉”,並觀察其在 2D 空間中的投影,直到我們獲得能夠最佳區分類別的視角。\n"
"在我們的例子中,輸入圖像有 784 個像素(輸入特徵),我們希望使用 PCA 將參數數量減少到僅 2 個,這樣我們就可以在圖表上繪製它們。這兩個參數將是原始特徵的線性組合,我們可以將這個過程視為“旋轉”我們原本的 784 維空間,並觀察其投影到 2D 空間,直到我們獲得最佳視角來分離類別。\n"
]
},
{
@ -1025,17 +1027,17 @@
}
},
"source": [
"如你所見0 和 1 可以用一條直線清楚地分開。這表明在原始的 784 維空間中,與數字對應的點也是線性可分的。而在 2 和 5 的情況下,我們無法找到能清楚分開這些數字的良好投影,因此會出現一些錯誤分類的情況。\n",
"如你所見0 和 1 可以用一條直線清楚地分。這表明在原始的784維空間中與數字對應的點也是線性可分的。而在2和5的情況下我們無法找到能清楚分隔這些數字的良好投影,因此會出現一些錯誤分類的情況。\n",
"\n",
"> 在這門課程的後續部分,我們將學習如何使用神經網絡創建非線性分類器,以及如何處理數字未正確對齊的問題。不久之後,我們將在 MNIST 數字分類中達到超過 99% 的準確率,並將這些數字分類為 10 個不同的類別。\n",
"> 在這門課程的後續部分,我們將學習如何使用神經網絡創建非線性分類器,以及如何處理數字未正確對齊的問題。不久之後,我們將在MNIST數字分類中達到超過99%的準確率同時將數字分類為10個不同的類別。\n",
"\n",
"## 重點\n",
"\n",
" * 我們學習了最簡單的神經網絡架構——單層感知器。\n",
" * 我們使用基於梯度下降的簡單訓練過程,手動實現了感知器。\n",
" * 儘管簡單,單層感知器可以解決手寫數字識別的相當複雜問題。\n",
" * 單層感知器是一個線性分類器,因此它提供了與邏輯回歸相同的分類能力。\n",
" * 在樣本空間中,感知器可以使用超平面分開兩類輸入數據。\n"
" * 儘管簡單,單層感知器可以解決相當複雜的手寫數字識別問題。\n",
" * 單層感知器是一個線性分類器,因此它提供的分類能力與邏輯回歸相同。\n",
" * 在樣本空間中,感知器可以使用超平面分隔輸入數據的兩個類別。\n"
]
},
{
@ -1044,14 +1046,14 @@
"source": [
"## 致謝\n",
"\n",
"此筆記本是 [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners) 的一部分,由 [Dmitry Soshnikov](http://soshnikov.com) 編寫。靈感來自於微軟劍橋研究院的神經網絡工作坊。一些代碼和示例材料取自 [Katja Hoffmann](https://www.microsoft.com/en-us/research/people/kahofman/)、[Matthew Johnson](https://www.microsoft.com/en-us/research/people/matjoh/) 和 [Ryoto Tomioka](https://www.microsoft.com/en-us/research/people/ryoto/) 的演示文稿,以及 [NeuroWorkshop](http://github.com/shwars/NeuroWorkshop) 資庫。\n"
"此筆記本是 [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners) 的一部分,由 [Dmitry Soshnikov](http://soshnikov.com) 編寫。靈感來自於微軟劍橋研究院的神經網絡工作坊。一些代碼和示例材料取自 [Katja Hoffmann](https://www.microsoft.com/en-us/research/people/kahofman/)、[Matthew Johnson](https://www.microsoft.com/en-us/research/people/matjoh/) 和 [Ryoto Tomioka](https://www.microsoft.com/en-us/research/people/ryoto/) 的演示文稿,以及 [NeuroWorkshop](http://github.com/shwars/NeuroWorkshop) 資庫。\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**免責聲明** \n本文件使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。儘管我們致力於提供準確的翻譯,請注意自動翻譯可能包含錯誤或不準確之處。原始語言的文件應被視為權威來源。對於重要資訊,建議使用專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或釋不承擔責任。\n"
"\n---\n\n**免責聲明** \n本文件使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。我們致力於提供準確的翻譯,請注意自動翻譯可能包含錯誤或不準確之處。應以原文文件作為權威來源。對於關鍵資訊,建議尋求專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或誤釋不承擔責任。\n"
]
}
],
@ -1080,8 +1082,8 @@
"start_slideshow_at": "selected"
},
"coopTranslator": {
"original_hash": "914fc55f59efc7e17b8130d4033ac617",
"translation_date": "2025-08-31T10:14:12+00:00",
"original_hash": "d67e5b54ba20b507aa88d71aa3d042d8",
"translation_date": "2025-10-03T13:13:54+00:00",
"source_file": "lessons/3-NeuralNetworks/03-Perceptron/Perceptron.ipynb",
"language_code": "tw"
}

View File

@ -11,9 +11,9 @@
"source": [
"## Перцептрон\n",
"\n",
"> Цей блокнот є частиною [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners). Відвідайте репозиторій, щоб отримати повний набір навчальних матеріалів.\n",
"> Цей ноутбук є частиною [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners). Відвідайте репозиторій для повного набору навчальних матеріалів.\n",
"\n",
"Як ми вже обговорювали, перцептрон дозволяє вирішувати **задачу бінарної класифікації**, тобто класифікувати вхідні приклади на дві категорії - ми можемо назвати їх **позитивними** і **негативними**.\n",
"Як ми вже обговорювали, перцептрон дозволяє вирішувати **задачу бінарної класифікації**, тобто класифікувати приклади введення в два класи - ми можемо назвати їх **позитивний** і **негативний**.\n",
"\n",
"Спочатку імпортуємо деякі необхідні бібліотеки.\n"
]
@ -49,9 +49,9 @@
"source": [
"## Проста задача\n",
"\n",
"Для початку розглянемо просту задачу, де у нас є дві вхідні ознаки. Наприклад, у медицині ми можемо класифікувати пухлини як доброякісні або злоякісні, залежно від їхнього розміру та віку.\n",
"Для початку розглянемо просту задачу, де у нас є два вхідні параметри. Наприклад, у медицині ми можемо класифікувати пухлини як доброякісні або злоякісні залежно від їхнього розміру та віку.\n",
"\n",
"Ми створимо випадковий набір даних для класифікації, використовуючи функцію `make_classification` з бібліотеки SciKit Learn:\n"
"Ми створимо випадковий набір даних для класифікації за допомогою функції `make_classification` з бібліотеки SciKit Learn:\n"
]
},
{
@ -166,7 +166,7 @@
" \\end{cases} \\\\\n",
"$$\n",
"\n",
"Однак загальна лінійна модель також повинна мати зміщення (bias), тобто ідеально ми повинні обчислювати $y$ як $y=f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}+\\mathbf{b})$. Щоб спростити нашу модель, ми можемо позбутися цього зміщення, додавши ще один вимір до наших вхідних ознак, який завжди дорівнює 1:\n"
"Однак загальна лінійна модель також повинна мати зсув (bias), тобто ідеально ми повинні обчислювати $y$ як $y=f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}+\\mathbf{b})$. Щоб спростити нашу модель, ми можемо позбутися цього зсуву, додавши ще один вимір до наших вхідних ознак, який завжди дорівнює 1:\n"
]
},
{
@ -204,9 +204,9 @@
}
},
"source": [
"## Алгоритм Навчання\n",
"## Алгоритм навчання\n",
"\n",
"Для того, щоб навчити перцептрон, нам потрібно знайти ваги $\\mathbf{w}$, які мінімізують помилку. Помилка визначається за допомогою **критерію перцептрона**:\n",
"Для навчання перцептрона необхідно знайти ваги $\\mathbf{w}$, які мінімізують помилку. Помилка визначається за допомогою **критерію перцептрона**:\n",
"\n",
"$$E(\\mathbf{w}) = -\\sum_{n \\in \\mathcal{M}}\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}_{n}t_{n}$$\n",
" \n",
@ -217,7 +217,7 @@
"\n",
"$$\\mathbf{w}^{\\tau + 1}=\\mathbf{w}^{\\tau} - \\eta \\nabla E(\\mathbf{w}) = \\mathbf{w}^{\\tau} + \\eta\\sum_{n \\in \\mathcal{M}}\\mathbf{x}_{n} t_{n}$$\n",
"\n",
"де $\\eta$ - це **швидкість навчання**, а $\\tau\\in\\mathbb{N}$ - номер ітерації.\n",
"де $\\eta$ - **швидкість навчання**, а $\\tau\\in\\mathbb{N}$ - номер ітерації.\n",
"\n",
"Давайте визначимо цей алгоритм на Python:\n"
]
@ -271,7 +271,9 @@
{
"cell_type": "markdown",
"metadata": {},
"source": []
"source": [
"Тепер давайте запустимо навчання на нашому наборі даних:\n"
]
},
{
"cell_type": "code",
@ -379,7 +381,7 @@
"source": [
"## Оцінка на тестовому наборі даних\n",
"\n",
"Спочатку ми відклали частину даних для тестового набору. Давайте перевіримо, наскільки точним є наш класифікатор на цьому тестовому наборі. Для цього ми також розширюємо тестовий набір додатковим виміром, множимо на матрицю ваг і переконуємося, що отримане значення має той самий знак, що й мітка (+1 або -1). Потім ми підсумовуємо всі булеві значення та ділимо на довжину тестового зразка, щоб отримати точність:\n"
"Спочатку ми відклали частину даних для тестового набору. Давайте перевіримо, наскільки точним є наш класифікатор на цьому тестовому наборі даних. Для цього ми також розширюємо тестовий набір даних додатковим виміром, множимо на матрицю ваг і переконуємося, що отримане значення має той самий знак, що й мітка (+1 або -1). Потім ми додаємо всі булеві значення і ділимо на довжину тестового зразка, щоб отримати точність:\n"
]
},
{
@ -420,7 +422,7 @@
"source": [
"## Спостереження за процесом навчання\n",
"\n",
"Ми вже бачили, як точність зменшується під час навчання. Було б цікаво побачити, як змінюється лінія розділення протягом навчання. Наведений нижче код дозволить візуалізувати все на одному графіку, і ви зможете переміщати повзунок, щоб \"подорожувати у часі\" через процес навчання.\n"
"Ми вже бачили, як точність зменшується під час навчання. Було б цікаво побачити, як змінюється лінія розділення в процесі навчання. Наведений нижче код дозволить візуалізувати все на одному графіку, і ви зможете переміщати повзунок, щоб \"подорожувати в часі\" через процес навчання.\n"
]
},
{
@ -527,9 +529,9 @@
"source": [
"## Обмеження перцептрона\n",
"\n",
"Як ви вже бачили, перцептрон є **лінійним класифікатором**. Він добре розрізняє два класи, якщо вони є **лінійно роздільними**, тобто їх можна розділити прямою лінією. В іншому випадку процес навчання перцептрона не буде сходитися.\n",
"Як ви бачили вище, перцептрон є **лінійним класифікатором**. Він добре розрізняє два класи, якщо вони **лінійно роздільні**, тобто можуть бути розділені прямою лінією. В іншому випадку процес навчання перцептрона не буде сходитися.\n",
"\n",
"Найочевиднішим прикладом задачі, яку не можна розв'язати за допомогою перцептрона, є так звана **проблема XOR**. Ми хочемо, щоб наш перцептрон навчився булевій функції XOR, яка має наступну таблицю істинності:\n",
"Найочевиднішим прикладом задачі, яку не можна вирішити за допомогою перцептрона, є так звана **XOR задача**. Ми хочемо, щоб наш перцептрон навчився булевій функції XOR, яка має наступну таблицю істинності:\n",
"\n",
"| | 0 | 1 |\n",
"|---|---|---|\n",
@ -603,7 +605,7 @@
}
},
"source": [
"Як видно з графіка вище, точність ніколи не перевищує 75%, оскільки неможливо провести пряму лінію таким чином, щоб правильно класифікувати всі можливі приклади.\n",
"Як видно з графіка вище, точність ніколи не перевищує 75%, оскільки неможливо провести пряму лінію так, щоб правильно класифікувати всі можливі приклади.\n",
"\n",
"Проблема XOR є класичним прикладом обмежень перцептрона, і на неї звернули увагу Марвін Мінскі та Сеймур Паперт у 1969 році у своїй книзі [Perceptrons](https://en.wikipedia.org/wiki/Perceptrons_(book)). Це спостереження обмежило дослідження в області нейронних мереж майже на 10 років, хоча - і ми побачимо це в наступному розділі нашого курсу - багатошарові перцептрони цілком здатні вирішувати такі задачі.\n",
"\n",
@ -611,13 +613,13 @@
"\n",
"Хоча перцептрон не може вирішити проблему XOR, він може вирішувати набагато складніші задачі, такі як розпізнавання рукописних символів.\n",
"\n",
"Набір даних, який часто використовується для освоєння машинного навчання, називається [MNIST](https://en.wikipedia.org/wiki/MNIST_database). Він був створений Модифікованим Національним Інститутом Стандартів і Технологій і містить навчальний набір із 60000 рукописних цифр, зібраних приблизно від 250 студентів і співробітників інституту. Також є тестовий набір даних із 10000 цифр, зібраних від інших осіб.\n",
"Набір даних, який часто використовується для освоєння машинного навчання, називається [MNIST](https://en.wikipedia.org/wiki/MNIST_database). Він був створений Модифікованим Національним Інститутом Стандартів і Технологій і містить навчальний набір із 60 000 рукописних цифр, зібраних приблизно від 250 студентів і співробітників інституту. Також є тестовий набір даних із 10 000 цифр, зібраних від інших осіб.\n",
"\n",
"Усі цифри представлені у вигляді зображень у градаціях сірого розміром 28x28 пікселів.\n",
"\n",
"> Набір даних MNIST доступний як навчальне змагання на [Kaggle](https://www.kaggle.com/c/digit-recognizer), сайті, який проводить конкурси та змагання з машинного навчання. Як тільки ви навчитеся класифікувати цифри MNIST, ви можете подати своє рішення на Kaggle, щоб побачити, як воно оцінюється серед інших учасників.\n",
"\n",
"Ми починаємо з завантаження набору даних MNIST:\n"
"Почнемо з завантаження набору даних MNIST:\n"
]
},
{
@ -693,7 +695,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Оскільки перцептрон є бінарним класифікатором, ми обмежимо нашу задачу розпізнаванням лише двох цифр. Наведена нижче функція заповнить масиви позитивних і негативних зразків двома заданими цифрами (а також покаже зразки цих цифр для ясності).\n"
"Оскільки перцептрон є бінарним класифікатором, ми обмежимо нашу задачу розпізнаванням лише двох цифр. Наведена нижче функція заповнить масиви позитивних і негативних зразків двома заданими цифрами (а також покаже зразки цих цифр для наочності).\n"
]
},
{
@ -732,7 +734,9 @@
{
"cell_type": "markdown",
"metadata": {},
"source": []
"source": [
"Ми почнемо з спроби класифікувати між 0 і 1:\n"
]
},
{
"cell_type": "code",
@ -827,11 +831,11 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Зверніть увагу, як точність дуже швидко наближається до майже 100%.\n",
"Зверніть увагу, як точність дуже швидко досягає майже 100%.\n",
"\n",
"Будь ласка, перемістіть повзунок до якоїсь позиції ближче до кінця навчання і спостерігайте за матрицею ваг, яка відображається зліва. Ця матриця дозволить вам зрозуміти, як працює перцептрон. Ви можете побачити високі значення ваг у центрі поля, які відповідають пікселям, що зазвичай присутні для цифри 1, і низькі негативні значення по краях, де знаходяться частини цифри 0. Отже, якщо цифра, представлена перцептрону, дійсно є 1, її центральна частина буде множитися на високі значення, що дасть позитивний результат. Навпаки, коли перцептрон бачить цифру 0, відповідні пікселі будуть множитися на негативні числа.\n",
"Будь ласка, перемістіть повзунок до якоїсь позиції ближче до кінця навчання і спостерігайте за матрицею ваг, яка відображається зліва. Ця матриця допоможе вам зрозуміти, як працює перцептрон. Ви можете побачити високі значення ваг у центрі поля, які відповідають пікселям, що зазвичай присутні для цифри 1, і низькі негативні значення по краях, де знаходяться частини цифри 0. Отже, якщо цифра, представлена перцептрону, дійсно є 1, її центральна частина буде множитися на високі значення, що дасть позитивний результат. Навпаки, коли перцептрон бачить цифру 0, відповідні пікселі будуть множитися на негативні числа.\n",
"\n",
"> Ви можете помітити, що якщо ми дамо нашому перцептрону цифру 1, трохи зміщену горизонтально, так що її пікселі займають місце, де є вертикальні частини цифри 0, ми можемо отримати некоректний результат. Оскільки природа нашого набору даних MNIST така, що всі цифри центровані та правильно позиціоновані, перцептрон покладається на це для розрізнення цифр.\n",
"> Ви можете помітити, що якщо ми дамо нашому перцептрону цифру 1, трохи зміщену горизонтально, так що її пікселі займають місце, де знаходяться вертикальні частини цифри 0, ми можемо отримати некоректний результат. Оскільки природа нашого набору даних MNIST така, що всі цифри центровані та правильно позиціоновані, перцептрон покладається на це для розрізнення цифр.\n",
"\n",
"Тепер спробуймо різні цифри:\n"
]
@ -909,11 +913,11 @@
"source": [
"## Обговорення\n",
"\n",
"З якоїсь причини, 2 і 5 не так легко розділити. Хоча ми отримуємо відносно високу точність (понад 85%), можна чітко побачити, як перцептрон перестає навчатися на певному етапі.\n",
"З якоїсь причини цифри 2 і 5 не так легко розділити. Хоча ми отримуємо досить високу точність (понад 85%), можна чітко побачити, як перцептрон перестає навчатися на певному етапі.\n",
"\n",
"Щоб зрозуміти, чому це відбувається, ми можемо спробувати використати [Аналіз головних компонент](https://uk.wikipedia.org/wiki/Аналіз_головнихомпонент) (PCA). Це техніка машинного навчання, яка використовується для зменшення розмірності вхідного набору даних таким чином, щоб досягти найкращого розділення між класами.\n",
"Щоб зрозуміти, чому це відбувається, ми можемо спробувати використати [Аналіз головних компонент](https://en.wikipedia.org/wiki/Principal_component_analysis) (PCA). Це техніка машинного навчання, яка використовується для зниження розмірності вхідного набору даних таким чином, щоб досягти найкращого розділення між класами.\n",
"\n",
"У нашому випадку вхідне зображення має 784 пікселі (вхідні ознаки), і ми хочемо використати PCA, щоб зменшити кількість параметрів до лише 2, щоб ми могли відобразити їх на графіку. Ці два параметри будуть лінійною комбінацією оригінальних ознак, і ми можемо розглядати цю процедуру як \"обертання\" нашого початкового 784-вимірного простору та спостереження його проєкції у 2D-простір, поки ми не отримаємо найкращий вигляд, який розділяє класи.\n"
"У нашому випадку вхідне зображення має 784 пікселі (вхідні ознаки), і ми хочемо використати PCA, щоб зменшити кількість параметрів до лише 2, щоб можна було побудувати їх графік. Ці два параметри будуть лінійною комбінацією оригінальних ознак, і цей процес можна уявити як \"обертання\" нашого початкового 784-вимірного простору та спостереження його проекції на 2D-простір, поки ми не отримаємо найкращий вигляд, який розділяє класи.\n"
]
},
{
@ -1023,26 +1027,26 @@
}
},
"source": [
"Як ви можете бачити, 0 і 1 можна чітко розділити прямою лінією. Це свідчить про те, що в початковому 784-вимірному просторі точки, які відповідають цифрам, також лінійно роздільні. У випадку з 2 і 5 ми не можемо знайти хорошу проєкцію, яка б чітко розділила ці цифри, і тому трапляються випадки неправильної класифікації.\n",
"Як ви можете бачити, 0 і 1 можна чітко розділити прямою лінією. Це свідчить про те, що в початковому 784-вимірному просторі точки, які відповідають цифрам, також лінійно роздільні. У випадку з 2 і 5 ми не можемо знайти хорошу проекцію, яка б чітко розділила ці цифри, і тому є випадки неправильної класифікації.\n",
"\n",
"> Пізніше в цьому курсі ми дізнаємося, як створювати нелінійні класифікатори за допомогою нейронних мереж і як вирішувати проблему неправильного вирівнювання цифр. Дуже скоро ми досягнемо точності понад 99% у класифікації цифр MNIST, розподіляючи їх на 10 різних класів.\n",
"> Пізніше в цьому курсі ми навчимося створювати нелінійні класифікатори за допомогою нейронних мереж і вирішувати проблему неправильного вирівнювання цифр. Дуже скоро ми досягнемо точності понад 99% у класифікації цифр MNIST, класифікуючи їх у 10 різних класів.\n",
"\n",
"## Основні висновки\n",
"\n",
" * Ми дізналися про найпростішу архітектуру нейронної мережі — одношаровий перцептрон.\n",
" * Ми ознайомилися з найпростішою архітектурою нейронної мережі — одношаровим перцептроном.\n",
" * Ми реалізували перцептрон \"вручну\", використовуючи просту процедуру навчання на основі градієнтного спуску.\n",
" * Незважаючи на простоту, одношаровий перцептрон може вирішувати досить складні задачі розпізнавання рукописних цифр.\n",
" * Одношаровий перцептрон є лінійним класифікатором, і тому він забезпечує таку ж класифікаційну потужність, як і логістична регресія.\n",
" * У просторі вибірки перцептрон може розділяти два класи вхідних даних за допомогою гіперплощини.\n"
" * У просторі зразків перцептрон може розділяти два класи вхідних даних за допомогою гіперплощини.\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Подяки\n",
"## Авторство\n",
"\n",
"Цей ноутбук є частиною [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners) і був підготовлений [Дмитром Сошниковим](http://soshnikov.com). Він натхненний майстернею з нейронних мереж у Microsoft Research Cambridge. Деякий код і ілюстративні матеріали взяті з презентацій [Каті Гоффманн](https://www.microsoft.com/en-us/research/people/kahofman/), [Меттью Джонсона](https://www.microsoft.com/en-us/research/people/matjoh/) і [Рьото Томіоки](https://www.microsoft.com/en-us/research/people/ryoto/), а також із репозиторію [NeuroWorkshop](http://github.com/shwars/NeuroWorkshop).\n"
"Цей блокнот є частиною [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners) і був підготовлений [Дмитром Сошниковим](http://soshnikov.com). Він натхненний семінаром з нейронних мереж у Microsoft Research Cambridge. Деякий код і ілюстративні матеріали взяті з презентацій [Каті Хоффманн](https://www.microsoft.com/en-us/research/people/kahofman/), [Метью Джонсона](https://www.microsoft.com/en-us/research/people/matjoh/) і [Рьото Томіоки](https://www.microsoft.com/en-us/research/people/ryoto/), а також із репозиторію [NeuroWorkshop](http://github.com/shwars/NeuroWorkshop).\n"
]
},
{
@ -1078,8 +1082,8 @@
"start_slideshow_at": "selected"
},
"coopTranslator": {
"original_hash": "914fc55f59efc7e17b8130d4033ac617",
"translation_date": "2025-08-30T09:50:36+00:00",
"original_hash": "d67e5b54ba20b507aa88d71aa3d042d8",
"translation_date": "2025-10-03T13:49:35+00:00",
"source_file": "lessons/3-NeuralNetworks/03-Perceptron/Perceptron.ipynb",
"language_code": "uk"
}

View File

@ -49,9 +49,9 @@
"source": [
"## کھلونا مسئلہ\n",
"\n",
"شروع کرنے کے لیے، آئیے ایک کھلونا مسئلے سے آغاز کرتے ہیں، جہاں ہمارے پاس دو ان پٹ خصوصیات ہیں۔ مثال کے طور پر، طب میں ہم ٹیومرز کو ان کے سائز اور عمر کی بنیاد پر خوش خیم اور مہلک میں تقسیم کرنا چاہتے ہیں۔\n",
"شروع کرنے کے لیے، آئیے ایک کھلونا مسئلہ سے آغاز کرتے ہیں، جہاں ہمارے پاس دو ان پٹ خصوصیات ہیں۔ مثال کے طور پر، طب میں ہم ٹیومرز کو ان کے سائز اور عمر کی بنیاد پر خوش خیم اور مہلک میں تقسیم کرنا چاہتے ہیں۔\n",
"\n",
"ہم SciKit Learn لائبریری کے `make_classification` فنکشن کا استعمال کرتے ہوئے ایک تصادفی درجہ بندی ڈیٹا سیٹ تیار کریں گے:\n"
"ہم SciKit Learn لائبریری کے `make_classification` فنکشن کا استعمال کرتے ہوئے ایک تصادفی درجہ بندی ڈیٹا سیٹ بنائیں گے:\n"
]
},
{
@ -154,7 +154,7 @@
"source": [
"## پرسیپٹرون\n",
"\n",
"چونکہ پرسیپٹرون ایک بائنری کلاسیفائر ہے، ہر ان پٹ ویکٹر $x$ کے لیے ہمارے پرسیپٹرون کا آؤٹ پٹ یا تو +1 ہوگا یا -1، جو کہ کلاس پر منحصر ہے۔ آؤٹ پٹ درج ذیل فارمولے کے ذریعے شمار کیا جائے گا:\n",
"چونکہ پرسیپٹرون ایک بائنری کلاسیفائر ہے، ہر ان پٹ ویکٹر $x$ کے لیے ہمارے پرسیپٹرون کا آؤٹ پٹ یا تو +1 ہوگا یا -1، جو کلاس پر منحصر ہے۔ آؤٹ پٹ درج ذیل فارمولے کے ذریعے حساب کیا جائے گا:\n",
"\n",
"$$y(\\mathbf{x}) = f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x})$$\n",
"\n",
@ -166,7 +166,7 @@
" \\end{cases} \\\\\n",
"$$\n",
"\n",
"تاہم، ایک عمومی لکیری ماڈل میں ایک بایس بھی شامل ہونا چاہیے، یعنی مثالی طور پر ہمیں $y$ کو اس طرح شمار کرنا چاہیے: $y=f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}+\\mathbf{b})$۔ اپنے ماڈل کو آسان بنانے کے لیے، ہم اس بایس ٹرم کو ختم کر سکتے ہیں، اور ان پٹ فیچرز میں ایک اضافی ڈائمینشن شامل کر سکتے ہیں، جو ہمیشہ 1 کے برابر ہو:\n"
"تاہم، ایک عمومی لکیری ماڈل میں بایاس بھی شامل ہونا چاہیے، یعنی مثالی طور پر ہمیں $y$ کو $y=f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}+\\mathbf{b})$ کے طور پر حساب کرنا چاہیے۔ اپنے ماڈل کو آسان بنانے کے لیے، ہم اس بایاس ٹرم کو ختم کر سکتے ہیں، اور اپنی ان پٹ فیچرز میں ایک اضافی ڈائمینشن شامل کر سکتے ہیں، جو ہمیشہ 1 کے برابر ہوتی ہے:\n"
]
},
{
@ -206,20 +206,20 @@
"source": [
"## تربیتی الگورتھم\n",
"\n",
"پرسپٹرون کو تربیت دینے کے لیے، ہمیں ایسے وزن $\\mathbf{w}$ تلاش کرنے ہوں گے جو غلطی کو کم سے کم کریں۔ غلطی کو **پرسپٹرون معیار** کے ذریعے بیان کیا جاتا ہے:\n",
"پرسپٹرون کو تربیت دینے کے لیے، ہمیں ایسے وزن $\\mathbf{w}$ تلاش کرنے ہوں گے جو غلطی کو کم کریں۔ غلطی کو **پرسپٹرون معیار** کے ذریعے بیان کیا گیا ہے:\n",
"\n",
"$$E(\\mathbf{w}) = -\\sum_{n \\in \\mathcal{M}}\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}_{n}t_{n}$$\n",
" \n",
" * $t_{n} \\in \\{-1, +1\\}$ منفی اور مثبت تربیتی نمونوں کے لیے، بالترتیب\n",
" * $\\mathcal{M}$ - غلط طور پر درجہ بند مثالوں کا مجموعہ\n",
" \n",
"ہم **گریڈینٹ ڈیسنٹ** کے عمل کا استعمال کریں گے۔ ابتدائی طور پر کچھ بے ترتیب وزن $\\mathbf{w}^{(0)}$ سے شروع کرتے ہوئے، ہم تربیت کے ہر مرحلے پر $E$ کے گریڈینٹ کا استعمال کرتے ہوئے وزن کو ایڈجسٹ کریں گے:\n",
"ہم **گریڈینٹ ڈیسنٹ** کے عمل کا استعمال کریں گے۔ ابتدائی طور پر کچھ بے ترتیب وزن $\\mathbf{w}^{(0)}$ سے شروع کرتے ہوئے، ہم تربیت کے ہر مرحلے پر وزن کو $E$ کے گریڈینٹ کا استعمال کرتے ہوئے ایڈجسٹ کریں گے:\n",
"\n",
"$$\\mathbf{w}^{\\tau + 1}=\\mathbf{w}^{\\tau} - \\eta \\nabla E(\\mathbf{w}) = \\mathbf{w}^{\\tau} + \\eta\\sum_{n \\in \\mathcal{M}}\\mathbf{x}_{n} t_{n}$$\n",
"\n",
"جہاں $\\eta$ ایک **سیکھنے کی شرح** ہے، اور $\\tau\\in\\mathbb{N}$ - تکرار کی تعداد۔\n",
"\n",
"آئیے اس الگورتھم کو Python میں بیان کرتے ہیں:\n"
"آئیے اس الگورتھم کو Python میں بیان کریں:\n"
]
},
{
@ -271,7 +271,9 @@
{
"cell_type": "markdown",
"metadata": {},
"source": []
"source": [
"چلو اب اپنے ڈیٹاسیٹ پر تربیت شروع کرتے ہیں:\n"
]
},
{
"cell_type": "code",
@ -309,9 +311,9 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"جیسا کہ آپ دیکھ سکتے ہیں، ابتدائی درستگی تقریباً 50% کے قریب ہے، لیکن یہ تیزی سے بڑھ کر 90% کے قریب اعلیٰ اقدار تک پہنچ جاتی ہے۔\n",
"جیسا کہ آپ دیکھ سکتے ہیں، ابتدائی درستگی تقریباً 50% کے قریب ہے، لیکن یہ جلد ہی بڑھ کر 90% کے قریب اعلیٰ اقدار تک پہنچ جاتی ہے۔\n",
"\n",
"آئیے دیکھتے ہیں کہ کلاسز کس طرح الگ ہوتی ہیں۔ ہماری درجہ بندی کی فنکشن $\\mathbf{w}^Tx$ کی طرح دکھائی دیتی ہے، اور یہ ایک کلاس کے لیے 0 سے زیادہ ہوتی ہے، جبکہ دوسری کلاس کے لیے 0 سے کم۔ اس طرح، کلاسز کو الگ کرنے والی لائن $\\mathbf{w}^Tx = 0$ سے متعین ہوتی ہے۔ چونکہ ہمارے پاس صرف دو جہتیں ہیں $x_0$ اور $x_1$، اس لائن کے لیے مساوات ہوگی $w_0x_0+w_1x_1+w_2 = 0$ (یاد رہے کہ ہم نے واضح طور پر ایک اضافی جہت $x_2=1$ کو متعین کیا ہے)۔ آئیے اس لائن کو گراف پر دکھاتے ہیں:\n"
"آئیے دیکھتے ہیں کہ کلاسز کس طرح الگ ہوتی ہیں۔ ہماری درجہ بندی کی فنکشن $\\mathbf{w}^Tx$ کی طرح ہے، اور یہ ایک کلاس کے لیے 0 سے زیادہ ہے، اور دوسری کے لیے 0 سے کم۔ اس طرح، کلاسز کو الگ کرنے والی لائن $\\mathbf{w}^Tx = 0$ سے متعین ہوتی ہے۔ چونکہ ہمارے پاس صرف دو ابعاد $x_0$ اور $x_1$ ہیں، لائن کے لیے مساوات $w_0x_0+w_1x_1+w_2 = 0$ ہوگی (یاد رکھیں کہ ہم نے واضح طور پر ایک اضافی بُعد $x_2=1$ کو متعین کیا ہے)۔ آئیے اس لائن کو گراف پر دکھاتے ہیں:\n"
]
},
{
@ -379,7 +381,7 @@
"source": [
"## ٹیسٹ ڈیٹاسیٹ پر جانچ کریں\n",
"\n",
"شروع میں، ہم نے کچھ ڈیٹا کو ٹیسٹ ڈیٹاسیٹ کے لیے الگ رکھا تھا۔ آئیے دیکھتے ہیں کہ ہمارا کلاسیفائر اس ٹیسٹ ڈیٹاسیٹ پر کتنا درست ہے۔ اس کے لیے، ہم ٹیسٹ ڈیٹاسیٹ کو ایک اضافی ڈائمینشن کے ساتھ بڑھاتے ہیں، ویٹس میٹرکس سے ضرب دیتے ہیں، اور یہ یقینی بناتے ہیں کہ حاصل شدہ قدر لیبل (+1 یا -1) کے ساتھ ایک ہی نشان کی ہو۔ پھر ہم تمام بولین قدروں کو جمع کرتے ہیں اور ٹیسٹ سیمپل کی لمبائی سے تقسیم کرتے ہیں تاکہ درستگی حاصل کی جا سکے:\n"
"شروع میں، ہم نے کچھ ڈیٹا کو ٹیسٹ ڈیٹاسیٹ کے لیے الگ رکھا تھا۔ آئیے دیکھتے ہیں کہ ہمارا کلاسیفائر اس ٹیسٹ ڈیٹاسیٹ پر کتنا درست ہے۔ اس کے لیے، ہم ٹیسٹ ڈیٹاسیٹ کو ایک اضافی ڈائمینشن کے ساتھ بڑھاتے ہیں، ویٹس میٹرکس سے ضرب دیتے ہیں، اور یہ یقینی بناتے ہیں کہ حاصل شدہ قدر لیبل (+1 یا -1) کے ساتھ ایک ہی نشان کی ہو۔ پھر ہم تمام بولین قدروں کو جمع کرتے ہیں اور ٹیسٹ سیمپل کی لمبائی سے تقسیم کرتے ہیں تاکہ درستگی حاصل ہو:\n"
]
},
{
@ -420,7 +422,7 @@
"source": [
"## تربیتی عمل کا مشاہدہ\n",
"\n",
"ہم نے پہلے دیکھا ہے کہ تربیت کے دوران درستگی کم ہوتی ہے۔ یہ دیکھنا دلچسپ ہوگا کہ تربیت کے دوران علیحدگی کی لائن کیسے تبدیل ہوتی ہے۔ نیچے دیا گیا کوڈ سب کچھ ایک گراف پر دکھائے گا، اور آپ سلائیڈر کو حرکت دے کر تربیتی عمل کے مختلف مراحل کا مشاہدہ کر سکیں گے۔\n"
"ہم نے پہلے دیکھا ہے کہ تربیت کے دوران درستگی کم ہوتی ہے۔ یہ دیکھنا دلچسپ ہوگا کہ تربیت کے دوران علیحدگی کی لکیر کیسے تبدیل ہوتی ہے۔ نیچے دیا گیا کوڈ سب کچھ ایک گراف پر ظاہر کرے گا، اور آپ سلائیڈر کو حرکت دے کر تربیتی عمل کے دوران \"وقت میں سفر\" کر سکیں گے۔\n"
]
},
{
@ -527,9 +529,9 @@
"source": [
"## پرسیپٹرون کی حدود\n",
"\n",
"جیسا کہ آپ نے اوپر دیکھا، پرسیپٹرون ایک **لکیری درجہ بندی کرنے والا** ہے۔ یہ دو کلاسز کے درمیان اچھی طرح فرق کر سکتا ہے اگر وہ **لکیری طور پر جدا ہونے کے قابل** ہوں، یعنی ایک سیدھی لکیر کے ذریعے الگ کی جا سکیں۔ بصورت دیگر، پرسیپٹرون کی تربیتی عمل کامیاب نہیں ہوگا۔\n",
"جیسا کہ آپ نے اوپر دیکھا، پرسیپٹرون ایک **لکیری درجہ بندی کرنے والا** ہے۔ یہ دو کلاسز کے درمیان اس وقت اچھی طرح فرق کر سکتا ہے جب وہ **لکیری طور پر جدا ہونے کے قابل** ہوں، یعنی ایک سیدھی لکیر کے ذریعے الگ کی جا سکیں۔ بصورت دیگر، پرسیپٹرون کی تربیتی عمل کبھی مکمل نہیں ہوگا۔\n",
"\n",
"ایک سب سے واضح مثال ایسے مسئلے کی ہے جسے پرسیپٹرون حل نہیں کر سکتا، جسے **XOR مسئلہ** کہا جاتا ہے۔ ہم چاہتے ہیں کہ ہمارا پرسیپٹرون XOR بولین فنکشن سیکھے، جس کا سچائی جدول درج ذیل ہے:\n",
"ایک سب سے واضح مثال ایسے مسئلے کی جو پرسیپٹرون سے حل نہیں ہو سکتا، وہ ہے **XOR مسئلہ**۔ ہم چاہتے ہیں کہ ہمارا پرسیپٹرون XOR بولین فنکشن سیکھے، جس کا سچائی جدول (truth table) درج ذیل ہے:\n",
"\n",
"| | 0 | 1 |\n",
"|---|---|---|\n",
@ -605,17 +607,17 @@
"source": [
"جیسا کہ آپ اوپر دیے گئے گراف سے دیکھ سکتے ہیں، درستگی کبھی بھی 75% سے زیادہ نہیں جاتی، کیونکہ تمام ممکنہ مثالوں کو درست کرنے کے لیے ایک سیدھی لکیر کھینچنا ناممکن ہے۔\n",
"\n",
"XOR مسئلہ پرسیپٹرون کی حدود کی ایک کلاسیکی مثال ہے، اور اسے مارون منسکی اور سیمور پیپرٹ نے 1969 میں اپنی کتاب [Perceptrons](https://en.wikipedia.org/wiki/Perceptrons_(book)) میں بیان کیا تھا۔ اس مشاہدے نے نیورل نیٹ ورکس کے شعبے میں تحقیق کو تقریباً 10 سال تک محدود رکھا، حالانکہ - اور ہم یہ اپنی کورس کی اگلی سیکشن میں دیکھیں گے - ملٹی لیئرڈ پرسیپٹرون ایسے مسائل کو حل کرنے کی مکمل صلاحیت رکھتے ہیں۔\n",
"XOR مسئلہ پرسیپٹرون کی حدود کی ایک کلاسیکی مثال ہے، اور اسے 1969 میں مارون منسکی اور سیمور پیپرٹ نے اپنی کتاب [Perceptrons](https://en.wikipedia.org/wiki/Perceptrons_(book)) میں بیان کیا تھا۔ اس مشاہدے نے نیورل نیٹ ورکس کے میدان میں تحقیق کو تقریباً 10 سال تک محدود رکھا، حالانکہ - اور ہم یہ اپنی کورس کی اگلی سیکشن میں دیکھیں گے - ملٹی لیئرڈ پرسیپٹرون ایسے مسائل کو حل کرنے کی مکمل صلاحیت رکھتے ہیں۔\n",
"\n",
"## پیچیدہ مثال - MNIST\n",
"\n",
"اگرچہ پرسیپٹرون XOR مسئلہ حل نہیں کر سکتا، لیکن یہ بہت زیادہ پیچیدہ مسائل حل کر سکتا ہے، جیسے ہاتھ سے لکھے ہوئے حروف کی شناخت۔\n",
"اگرچہ پرسیپٹرون XOR مسئلہ حل نہیں کر سکتا، لیکن یہ بہت زیادہ پیچیدہ مسائل کو حل کر سکتا ہے، جیسے ہاتھ سے لکھے گئے حروف کی شناخت۔\n",
"\n",
"مشین لرننگ سیکھنے کے دوران اکثر استعمال ہونے والا ایک ڈیٹاسیٹ [MNIST](https://en.wikipedia.org/wiki/MNIST_database) کہلاتا ہے۔ یہ Modified National Institute of Standards and Technology نے تیار کیا ہے، اور اس میں 60000 ہاتھ سے لکھے گئے ہندسوں کا تربیتی سیٹ شامل ہے، جو تقریباً 250 طلباء اور انسٹیٹیوٹ کے ملازمین سے جمع کیے گئے ہیں۔ اس کے علاوہ، 10000 ہندسوں کا ایک ٹیسٹ ڈیٹاسیٹ بھی موجود ہے، جو مختلف افراد سے جمع کیا گیا ہے۔\n",
"\n",
"تمام ہندسے 28x28 پکسلز کے گرے اسکیل تصاویر کی صورت میں پیش کیے گئے ہیں۔\n",
"\n",
"> MNIST ڈیٹاسیٹ [Kaggle](https://www.kaggle.com/c/digit-recognizer) پر ایک تربیتی مقابلے کے طور پر دستیاب ہے، جو مشین لرننگ کے مقابلے اور کانٹیسٹ کی میزبانی کرتا ہے۔ جب آپ MNIST ہندسوں کو درجہ بندی کرنا سیکھ لیں، تو آپ اپنا حل Kaggle پر جمع کروا سکتے ہیں تاکہ دیکھ سکیں کہ یہ دیگر شرکاء کے درمیان کیسے درجہ بندی کرتا ہے۔\n",
"> MNIST ڈیٹاسیٹ [Kaggle](https://www.kaggle.com/c/digit-recognizer) پر ایک تربیتی مقابلے کے طور پر دستیاب ہے، جو مشین لرننگ کے مقابلے اور مقابلہ جات کی میزبانی کرتا ہے۔ جب آپ MNIST ہندسوں کو درجہ بندی کرنا سیکھ لیں، تو آپ اپنا حل Kaggle پر جمع کروا سکتے ہیں تاکہ دیکھ سکیں کہ یہ دیگر شرکاء کے درمیان کیسے درجہ بندی کرتا ہے۔\n",
"\n",
"ہم MNIST ڈیٹاسیٹ کو لوڈ کرنے سے شروع کرتے ہیں:\n"
]
@ -693,7 +695,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"کیونکہ پرسیپٹرون ایک بائنری کلاسیفائر ہے، ہم اپنے مسئلے کو صرف دو ہندسوں کو پہچاننے تک محدود رکھیں گے۔ نیچے دی گئی فنکشن دو دیے گئے ہندسوں کے ساتھ مثبت اور منفی نمونوں کی صفوں کو بھرے گی (اور وضاحت کے لیے ان ہندسوں کے نمونے بھی دکھائے گی)۔\n"
"کیونکہ پرسیپٹرون ایک بائنری کلاسیفائر ہے، ہم اپنی مسئلہ کو صرف دو ہندسوں کو پہچاننے تک محدود رکھیں گے۔ نیچے دی گئی فنکشن دو دیے گئے ہندسوں کے ساتھ مثبت اور منفی نمونوں کے ارے کو بھرے گی (اور وضاحت کے لیے ان ہندسوں کے نمونے بھی دکھائے گی)۔\n"
]
},
{
@ -733,7 +735,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"ہم 0 اور 1 کے درمیان درجہ بندی کرنے کی کوشش سے شروع کریں گے:\n"
"ہم 0 اور 1 کے درمیان درجہ بندی کرنے کی کوشش سے شروع کریں گے۔\n"
]
},
{
@ -831,11 +833,11 @@
"source": [
"براہ کرم نوٹ کریں کہ درستگی بہت تیزی سے تقریباً 100% تک پہنچ جاتی ہے۔\n",
"\n",
"براہ کرم، تربیت کے اختتام کی طرف سلائیڈر کو کسی مقام پر منتقل کریں، اور بائیں جانب دکھائی جانے والی وزن کی میٹرکس کا مشاہدہ کریں۔ یہ میٹرکس آپ کو سمجھنے میں مدد دے گی کہ پرسیپٹرون درحقیقت کیسے کام کرتا ہے۔ آپ میدان کے درمیان میں وزن کی زیادہ قدریں دیکھ سکتے ہیں، جو ان پکسلز سے مطابقت رکھتی ہیں جو عام طور پر ہندسے 1 کے لیے موجود ہوتے ہیں، اور اطراف میں کم منفی قدریں، جہاں ہندسے 0 کے حصے ہوتے ہیں۔ لہٰذا، اگر پرسیپٹرون کو پیش کیا گیا ہندسہ درحقیقت 1 ہو، تو اس کے درمیانی حصے کو زیادہ قدروں سے ضرب دی جائے گی، جس سے مثبت نتیجہ نکلے گا۔ اس کے برعکس، جب پرسیپٹرون 0 کو دیکھتا ہے، تو متعلقہ پکسلز کو منفی نمبروں سے ضرب دی جائے گی۔\n",
"براہ کرم، سلائیڈر کو تربیت کے اختتام کی طرف کسی مقام پر لے جائیں، اور بائیں جانب دکھائی گئی وزن کی میٹرکس کا مشاہدہ کریں۔ یہ میٹرکس آپ کو یہ سمجھنے میں مدد دے گی کہ پرسیپٹرون درحقیقت کیسے کام کرتا ہے۔ آپ میدان کے درمیان میں وزن کی زیادہ قدریں دیکھ سکتے ہیں، جو ان پکسلز سے مطابقت رکھتی ہیں جو عام طور پر ہندسے 1 کے لیے موجود ہوتے ہیں، اور اطراف میں کم منفی قدریں، جہاں ہندسے 0 کے حصے ہوتے ہیں۔ لہٰذا، اگر پرسیپٹرون کو پیش کیا گیا ہندسہ درحقیقت 1 ہو، تو اس کے درمیانی حصے کو زیادہ قدروں سے ضرب دی جائے گی، جس سے مثبت نتیجہ نکلے گا۔ اس کے برعکس، جب پرسیپٹرون 0 کو دیکھتا ہے، تو متعلقہ پکسلز کو منفی نمبروں سے ضرب دی جائے گی۔\n",
"\n",
"> آپ یہ نوٹ کر سکتے ہیں کہ اگر ہم اپنے پرسیپٹرون کو ہندسہ 1 دیں جو افقی طور پر تھوڑا سا کھسکا ہوا ہو، تاکہ اس کے پکسلز اس جگہ پر ہوں جہاں 0 کے عمودی حصے ہوں، تو ہمیں غلط نتیجہ مل سکتا ہے۔ چونکہ ہمارے MNIST ڈیٹاسیٹ کی نوعیت ایسی ہے کہ تمام ہندسے مرکز میں اور صحیح طور پر پوزیشن میں ہوتے ہیں، اور پرسیپٹرون اسی پر انحصار کرتا ہے تاکہ ہندسوں کے درمیان فرق کر سکے۔\n",
"> آپ یہ نوٹ کر سکتے ہیں کہ اگر ہم اپنے پرسیپٹرون کو ہندسہ 1 تھوڑا سا افقی طور پر منتقل کر کے دیں، تاکہ اس کے پکسلز اس جگہ پر آجائیں جہاں 0 کے عمودی حصے ہوں، تو ہمیں غلط نتیجہ مل سکتا ہے۔ چونکہ ہمارے MNIST ڈیٹاسیٹ کی نوعیت ایسی ہے کہ تمام ہندسے مرکز میں اور درست طور پر پوزیشن میں ہوتے ہیں، اور پرسیپٹرون اسی پر انحصار کرتا ہے تاکہ ہندسوں کے درمیان فرق کر سکے۔\n",
"\n",
"اب آئیے مختلف ہندسوں کو آزماتے ہیں:\n"
"اب آئیے مختلف ہندسوں کو آزماتے ہیں: \n"
]
},
{
@ -911,11 +913,11 @@
"source": [
"## بحث\n",
"\n",
"کسی وجہ سے، 2 اور 5 کو آسانی سے الگ کرنا ممکن نہیں ہوتا۔ حالانکہ ہمیں نسبتاً زیادہ درستگی (85% سے زیادہ) حاصل ہوتی ہے، ہم واضح طور پر دیکھ سکتے ہیں کہ perceptron کسی مقام پر سیکھنا بند کر دیتا ہے۔\n",
"کسی وجہ سے، 2 اور 5 کو اتنی آسانی سے الگ نہیں کیا جا سکتا۔ حالانکہ ہمیں نسبتاً زیادہ درستگی (85% سے زیادہ) حاصل ہوتی ہے، ہم واضح طور پر دیکھ سکتے ہیں کہ کسی مقام پر perceptron سیکھنا بند کر دیتا ہے۔\n",
"\n",
"یہ سمجھنے کے لیے کہ ایسا کیوں ہوتا ہے، ہم [Principal Component Analysis](https://en.wikipedia.org/wiki/Principal_component_analysis) (PCA) استعمال کرنے کی کوشش کر سکتے ہیں۔ یہ ایک مشین لرننگ تکنیک ہے جو ان پٹ ڈیٹا سیٹ کی جہتوں کو کم کرنے کے لیے استعمال ہوتی ہے، اس طرح کہ کلاسز کے درمیان بہترین علیحدگی حاصل کی جا سکے۔\n",
"یہ سمجھنے کے لیے کہ ایسا کیوں ہوتا ہے، ہم [پرنسپل کمپوننٹ اینالیسس](https://en.wikipedia.org/wiki/Principal_component_analysis) (PCA) استعمال کرنے کی کوشش کر سکتے ہیں۔ یہ ایک مشین لرننگ تکنیک ہے جو ان پٹ ڈیٹا سیٹ کی جہت کو کم کرنے کے لیے استعمال ہوتی ہے، اس طرح کہ کلاسز کے درمیان بہترین علیحدگی حاصل کی جا سکے۔\n",
"\n",
"ہمارے معاملے میں، ایک ان پٹ تصویر میں 784 پکسلز (ان پٹ فیچرز) ہوتے ہیں، اور ہم PCA کا استعمال کرتے ہوئے پیرامیٹرز کی تعداد کو صرف 2 تک کم کرنا چاہتے ہیں، تاکہ ہم انہیں گراف پر پلاٹ کر سکیں۔ یہ دو پیرامیٹرز اصل فیچرز کا لکیری امتزاج ہوں گے، اور ہم اس عمل کو اس طرح دیکھ سکتے ہیں جیسے ہم اپنی اصل 784-جہتی جگہ کو \"گھما\" رہے ہوں اور اس کی پروجیکشن کو 2D-جگہ پر دیکھ رہے ہوں، جب تک کہ ہمیں وہ بہترین منظر نہ مل جائے جو کلاسز کو الگ کرتا ہو۔\n"
"ہمارے معاملے میں، ایک ان پٹ تصویر میں 784 پکسلز (ان پٹ فیچرز) ہوتے ہیں، اور ہم PCA کا استعمال کرتے ہوئے پیرامیٹرز کی تعداد کو صرف 2 تک کم کرنا چاہتے ہیں، تاکہ ہم انہیں گراف پر پلاٹ کر سکیں۔ یہ دو پیرامیٹرز اصل فیچرز کا لکیری امتزاج ہوں گے، اور ہم اس عمل کو اس طرح دیکھ سکتے ہیں جیسے ہم اپنی اصل 784-جہتی جگہ کو \"گھما\" رہے ہوں اور اس کی پروجیکشن کو اپنے 2D-اسپیس میں دیکھ رہے ہوں، جب تک کہ ہمیں کلاسز کو الگ کرنے کے لیے بہترین منظر نہ مل جائے۔\n"
]
},
{
@ -1025,17 +1027,17 @@
}
},
"source": [
"جیسا کہ آپ دیکھ سکتے ہیں، 0 اور 1 کو ایک سیدھی لکیر کے ذریعے واضح طور پر الگ کیا جا سکتا ہے۔ یہ ظاہر کرتا ہے کہ اصل 784-ابعادی جگہ میں وہ نقاط جو ہندسوں سے متعلق ہیں، بھی خطی طور پر الگ کیے جا سکتے ہیں۔ لیکن 2 اور 5 کے معاملے میں، ہم ایسی اچھی پروجیکشن نہیں ڈھونڈ سکتے جو ہندسوں کو واضح طور پر الگ کرے، اور اسی وجہ سے کچھ غلط درجہ بندی کے کیسز موجود ہیں۔\n",
"جیسا کہ آپ دیکھ سکتے ہیں، 0 اور 1 کو ایک سیدھی لکیر کے ذریعے واضح طور پر الگ کیا جا سکتا ہے۔ اس کا مطلب یہ ہے کہ اصل 784-ابعادی جگہ میں وہ نقاط جو اعداد کے مطابق ہیں، وہ بھی خطی طور پر الگ کیے جا سکتے ہیں۔ لیکن 2 اور 5 کے معاملے میں، ہم ایسی اچھی پروجیکشن نہیں ڈھونڈ سکتے جو اعداد کو واضح طور پر الگ کرے، اور اسی وجہ سے کچھ غلط درجہ بندی کے معاملات پیش آ سکتے ہیں۔\n",
"\n",
"> اس کورس میں آگے چل کر ہم سیکھیں گے کہ نیورل نیٹ ورکس کا استعمال کرتے ہوئے غیر خطی درجہ بندی کرنے والے کیسے بنائیں، اور ان مسائل سے کیسے نمٹیں جہاں ہندسے صحیح طریقے سے ترتیب نہیں دیے گئے ہوں۔ بہت جلد ہم MNIST ہندسوں کی درجہ بندی میں 99% سے زیادہ درستگی حاصل کریں گے، جبکہ انہیں 10 مختلف کلاسز میں تقسیم کریں گے۔\n",
"> اس کورس میں آگے چل کر ہم سیکھیں گے کہ نیورل نیٹ ورکس کا استعمال کرتے ہوئے غیر خطی درجہ بندی کرنے والے ماڈلز کیسے بنائے جاتے ہیں، اور ان مسائل سے کیسے نمٹا جاتا ہے جہاں اعداد صحیح طور پر ترتیب میں نہ ہوں۔ بہت جلد ہم MNIST ہندسوں کی درجہ بندی میں 99% سے زیادہ درستگی حاصل کریں گے، جبکہ انہیں 10 مختلف کلاسز میں تقسیم کریں گے۔\n",
"\n",
"## اہم نکات\n",
"\n",
" * ہم نے سب سے سادہ نیورل نیٹ ورک آرکیٹیکچر کے بارے میں سیکھا - ایک پرت والا پرسیپٹرون۔\n",
" * ہم نے پرسیپٹرون کو \"ہاتھ سے\" نافذ کیا، ایک سادہ تربیتی طریقہ کار استعمال کرتے ہوئے جو گریڈینٹ ڈیسنٹ پر مبنی ہے۔\n",
" * سادگی کے باوجود، ایک پرت والا پرسیپٹرون ہاتھ سے لکھے گئے ہندسوں کی پہچان کے پیچیدہ مسائل کو حل کر سکتا ہے۔\n",
" * ایک پرت والا پرسیپٹرون ایک خطی درجہ بندی کرنے والا ہے، اور اس طرح یہ لاجسٹک ریگریشن کے برابر درجہ بندی کی طاقت فراہم کرتا ہے۔\n",
" * نمونہ جگہ میں، پرسیپٹرون دو کلاسز کے ان پٹ ڈیٹا کو ہائپرپلین کے ذریعے الگ کر سکتا ہے۔\n"
" * ہم نے پرسیپٹرون کو \"دستی طور پر\" نافذ کیا، ایک سادہ تربیتی طریقہ کار استعمال کرتے ہوئے جو گریڈینٹ ڈیسنٹ پر مبنی ہے۔\n",
" * سادگی کے باوجود، ایک پرت والا پرسیپٹرون ہاتھ سے لکھے گئے ہندسوں کی پہچان جیسے پیچیدہ مسائل کو حل کر سکتا ہے۔\n",
" * ایک پرت والا پرسیپٹرون ایک خطی درجہ بندی کرنے والا ماڈل ہے، اور اس طرح یہ وہی درجہ بندی کی صلاحیت فراہم کرتا ہے جو لاجسٹک ریگریشن فراہم کرتی ہے۔\n",
" * نمونے کی جگہ میں، پرسیپٹرون ہائپرپلین کا استعمال کرتے ہوئے ان پٹ ڈیٹا کی دو کلاسز کو الگ کر سکتا ہے۔\n"
]
},
{
@ -1044,14 +1046,14 @@
"source": [
"## کریڈٹس\n",
"\n",
"یہ نوٹ بک [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners) کا حصہ ہے، اور اسے [Dmitry Soshnikov](http://soshnikov.com) نے تیار کیا ہے۔ یہ مائیکروسافٹ ریسرچ کیمبرج میں نیورل نیٹ ورک ورکشاپ سے متاثر ہے۔ کچھ کوڈ اور وضاحتی مواد [Katja Hoffmann](https://www.microsoft.com/en-us/research/people/kahofman/)، [Matthew Johnson](https://www.microsoft.com/en-us/research/people/matjoh/) اور [Ryoto Tomioka](https://www.microsoft.com/en-us/research/people/ryoto/) کی پریزنٹیشنز سے لیا گیا ہے، اور [NeuroWorkshop](http://github.com/shwars/NeuroWorkshop) ریپوزیٹری سے بھی شامل کیا گیا ہے۔\n"
"یہ نوٹ بک [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners) کا حصہ ہے، اور اسے [Dmitry Soshnikov](http://soshnikov.com) نے تیار کیا ہے۔ یہ Microsoft Research Cambridge میں نیورل نیٹ ورک ورکشاپ سے متاثر ہے۔ کچھ کوڈ اور وضاحتی مواد [Katja Hoffmann](https://www.microsoft.com/en-us/research/people/kahofman/)، [Matthew Johnson](https://www.microsoft.com/en-us/research/people/matjoh/) اور [Ryoto Tomioka](https://www.microsoft.com/en-us/research/people/ryoto/) کی پریزنٹیشنز سے لیا گیا ہے، اور [NeuroWorkshop](http://github.com/shwars/NeuroWorkshop) ریپوزیٹری سے بھی مواد شامل کیا گیا ہے۔\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**ڈسکلیمر**: \nیہ دستاویز AI ترجمہ سروس [Co-op Translator](https://github.com/Azure/co-op-translator) کا استعمال کرتے ہوئے ترجمہ کی گئی ہے۔ ہم درستگی کے لیے کوشش کرتے ہیں، لیکن براہ کرم آگاہ رہیں کہ خودکار ترجمے میں غلطیاں یا عدم درستگی ہو سکتی ہیں۔ اصل دستاویز، جو اس کی اصل زبان میں ہے، کو مستند ذریعہ سمجھا جانا چاہیے۔ اہم معلومات کے لیے، پیشہ ور انسانی ترجمہ کی سفارش کی جاتی ہے۔ اس ترجمے کے استعمال سے پیدا ہونے والی کسی بھی غلط فہمی یا غلط تشریح کے لیے ہم ذمہ دار نہیں ہیں۔\n"
"\n---\n\n**ڈسکلیمر**: \nیہ دستاویز AI ترجمہ سروس [Co-op Translator](https://github.com/Azure/co-op-translator) کا استعمال کرتے ہوئے ترجمہ کی گئی ہے۔ ہم درستگی کے لیے کوشش کرتے ہیں، لیکن براہ کرم آگاہ رہیں کہ خودکار ترجمے میں غلطیاں یا غیر درستیاں ہو سکتی ہیں۔ اصل دستاویز کو اس کی اصل زبان میں مستند ذریعہ سمجھا جانا چاہیے۔ اہم معلومات کے لیے، پیشہ ور انسانی ترجمہ کی سفارش کی جاتی ہے۔ ہم اس ترجمے کے استعمال سے پیدا ہونے والی کسی بھی غلط فہمی یا غلط تشریح کے ذمہ دار نہیں ہیں۔\n"
]
}
],
@ -1080,8 +1082,8 @@
"start_slideshow_at": "selected"
},
"coopTranslator": {
"original_hash": "914fc55f59efc7e17b8130d4033ac617",
"translation_date": "2025-08-29T06:41:31+00:00",
"original_hash": "d67e5b54ba20b507aa88d71aa3d042d8",
"translation_date": "2025-10-03T13:10:07+00:00",
"source_file": "lessons/3-NeuralNetworks/03-Perceptron/Perceptron.ipynb",
"language_code": "ur"
}

View File

@ -11,9 +11,9 @@
"source": [
"## Perceptron\n",
"\n",
"> Notebook này là một phần của [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners). Truy cập kho lưu trữ để xem đầy đủ tài liệu học tập.\n",
"> Notebook này là một phần của [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners). Truy cập kho lưu trữ để xem toàn bộ tài liệu học tập.\n",
"\n",
"Như chúng ta đã thảo luận, perceptron cho phép bạn giải quyết **bài toán phân loại nhị phân**, tức là phân loại các ví dụ đầu vào thành hai lớp - chúng ta có thể gọi chúng là **dương** và **âm**.\n",
"Như chúng ta đã thảo luận, perceptron cho phép bạn giải quyết **vấn đề phân loại nhị phân**, tức là phân loại các ví dụ đầu vào thành hai lớp - chúng ta có thể gọi chúng là **tích cực** và **tiêu cực**.\n",
"\n",
"Đầu tiên, hãy nhập một số thư viện cần thiết.\n"
]
@ -47,9 +47,9 @@
}
},
"source": [
"## Bài toán đơn giản\n",
"## Vấn đề Đơn Giản\n",
"\n",
"Để bắt đầu, chúng ta hãy bắt đầu với một bài toán đơn giản, nơi chúng ta có hai đặc trưng đầu vào. Ví dụ, trong y học, chúng ta có thể muốn phân loại khối u thành lành tính và ác tính, dựa trên kích thước và tuổi của nó.\n",
"Để bắt đầu, hãy bắt đầu với một vấn đề đơn giản, nơi chúng ta có hai đặc điểm đầu vào. Ví dụ, trong y học, chúng ta có thể muốn phân loại khối u thành lành tính và ác tính, dựa vào kích thước và tuổi của nó.\n",
"\n",
"Chúng ta sẽ tạo một tập dữ liệu phân loại ngẫu nhiên bằng cách sử dụng hàm `make_classification` từ thư viện SciKit Learn:\n"
]
@ -95,7 +95,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Hãy cùng vẽ biểu đồ tập dữ liệu:\n"
"Hãy cùng vẽ biểu đồ cho tập dữ liệu:\n"
]
},
{
@ -154,7 +154,7 @@
"source": [
"## Perceptron\n",
"\n",
"Vì perceptron là một bộ phân loại nhị phân, nên với mỗi vector đầu vào $x$, đầu ra của perceptron sẽ là +1 hoặc -1, tùy thuộc vào lớp. Đầu ra được tính bằng công thức:\n",
"Vì perceptron là một bộ phân loại nhị phân, nên với mỗi vector đầu vào $x$, đầu ra của perceptron sẽ là +1 hoặc -1, tùy thuộc vào lớp. Đầu ra sẽ được tính bằng công thức\n",
"\n",
"$$y(\\mathbf{x}) = f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x})$$\n",
"\n",
@ -166,7 +166,7 @@
" \\end{cases} \\\\\n",
"$$\n",
"\n",
"Tuy nhiên, một mô hình tuyến tính tổng quát cũng nên có một giá trị bias, tức là lý tưởng chúng ta nên tính $y$ dưới dạng $y=f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}+\\mathbf{b})$. Để đơn giản hóa mô hình, chúng ta có thể loại bỏ giá trị bias này bằng cách thêm một chiều nữa vào các đặc trưng đầu vào, luôn bằng 1:\n"
"Tuy nhiên, một mô hình tuyến tính tổng quát cũng nên có một bias, tức là lý tưởng chúng ta nên tính $y$ như $y=f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}+\\mathbf{b})$. Để đơn giản hóa mô hình, chúng ta có thể loại bỏ thành phần bias này bằng cách thêm một chiều nữa vào các đặc trưng đầu vào, luôn bằng 1:\n"
]
},
{
@ -204,7 +204,7 @@
}
},
"source": [
"## Thuật toán huấn luyện\n",
"## Thuật toán Huấn luyện\n",
"\n",
"Để huấn luyện perceptron, chúng ta cần tìm các trọng số $\\mathbf{w}$ sao cho giảm thiểu lỗi. Lỗi được định nghĩa bằng **tiêu chí perceptron**:\n",
"\n",
@ -271,7 +271,9 @@
{
"cell_type": "markdown",
"metadata": {},
"source": []
"source": [
"Bây giờ hãy chạy quá trình huấn luyện trên tập dữ liệu của chúng ta:\n"
]
},
{
"cell_type": "code",
@ -377,9 +379,9 @@
}
},
"source": [
"## Đánh giá trên Bộ Dữ Liệu Kiểm Tra\n",
"## Đánh giá trên Tập Dữ Liệu Kiểm Tra\n",
"\n",
"Ban đầu, chúng ta đã tách một phần dữ liệu để làm bộ dữ liệu kiểm tra. Hãy xem độ chính xác của bộ phân loại trên bộ dữ liệu kiểm tra này. Để thực hiện điều này, chúng ta cũng mở rộng bộ dữ liệu kiểm tra với một chiều bổ sung, nhân với ma trận trọng số, và đảm bảo rằng giá trị thu được có cùng dấu với nhãn (+1 hoặc -1). Sau đó, chúng ta cộng tất cả các giá trị boolean lại và chia cho độ dài của mẫu kiểm tra để tính độ chính xác:\n"
"Ban đầu, chúng ta đã tách một phần dữ liệu ra để làm tập dữ liệu kiểm tra. Hãy xem độ chính xác của bộ phân loại trên tập dữ liệu kiểm tra này. Để thực hiện điều này, chúng ta cũng mở rộng tập dữ liệu kiểm tra với một chiều bổ sung, nhân với ma trận trọng số, và đảm bảo rằng giá trị thu được có cùng dấu với nhãn (+1 hoặc -1). Sau đó, chúng ta cộng tất cả các giá trị boolean lại và chia cho độ dài của mẫu kiểm tra để tính độ chính xác:\n"
]
},
{
@ -529,7 +531,7 @@
"\n",
"Như bạn đã thấy ở trên, perceptron là một **bộ phân loại tuyến tính**. Nó có thể phân biệt tốt giữa hai lớp nếu chúng **có thể tách tuyến tính**, tức là có thể được phân tách bằng một đường thẳng. Nếu không, quá trình huấn luyện perceptron sẽ không hội tụ.\n",
"\n",
"Một ví dụ rõ ràng nhất về vấn đề không thể giải quyết bằng perceptron là vấn đề **XOR**. Chúng ta muốn perceptron học hàm boolean XOR, với bảng chân lý như sau:\n",
"Một ví dụ rõ ràng nhất về một vấn đề mà perceptron không thể giải quyết là vấn đề **XOR**. Chúng ta muốn perceptron học hàm boolean XOR, với bảng chân lý như sau:\n",
"\n",
"| | 0 | 1 |\n",
"|---|---|---|\n",
@ -605,19 +607,19 @@
"source": [
"Như bạn có thể thấy từ biểu đồ trên, độ chính xác không bao giờ vượt quá 75%, vì không thể vẽ một đường thẳng sao cho đúng với tất cả các ví dụ có thể.\n",
"\n",
"Vấn đề XOR là một ví dụ kinh điển về những hạn chế của perceptron, và nó đã được Marvin Minsky và Seymour Papert chỉ ra vào năm 1969 trong cuốn sách của họ [Perceptrons](https://en.wikipedia.org/wiki/Perceptrons_(book)). Quan sát này đã làm chậm lại nghiên cứu trong lĩnh vực mạng nơ-ron trong gần 10 năm, mặc dù - và chúng ta sẽ thấy điều này trong phần tiếp theo của khóa học - perceptron nhiều lớp hoàn toàn có khả năng giải quyết những vấn đề như vậy.\n",
"Vấn đề XOR là một ví dụ kinh điển về hạn chế của perceptron, và nó đã được Marvin Minsky và Seymour Papert chỉ ra vào năm 1969 trong cuốn sách của họ [Perceptrons](https://en.wikipedia.org/wiki/Perceptrons_(book)). Quan sát này đã làm hạn chế nghiên cứu trong lĩnh vực mạng nơ-ron gần 10 năm, mặc dù - và chúng ta sẽ thấy điều này trong phần tiếp theo của khóa học - perceptron nhiều lớp hoàn toàn có khả năng giải quyết các vấn đề như vậy.\n",
"\n",
"## Ví dụ phức tạp - MNIST\n",
"\n",
"Mặc dù perceptron không thể giải quyết vấn đề XOR, nhưng nó có thể giải quyết nhiều vấn đề phức tạp hơn, chẳng hạn như nhận diện chữ viết tay.\n",
"Mặc dù perceptron không thể giải quyết vấn đề XOR, nó có thể giải quyết nhiều vấn đề phức tạp hơn, chẳng hạn như nhận dạng ký tự viết tay.\n",
"\n",
"Một tập dữ liệu thường được sử dụng khi học máy là [MNIST](https://en.wikipedia.org/wiki/MNIST_database). Tập dữ liệu này được tạo ra bởi Viện Tiêu chuẩn và Công nghệ Quốc gia Sửa đổi (Modified National Institute of Standards and Technology), và chứa một tập huấn luyện gồm 60.000 chữ số viết tay, được thu thập từ khoảng 250 sinh viên và nhân viên của viện. Ngoài ra còn có một tập kiểm tra gồm 10.000 chữ số, được thu thập từ các cá nhân khác nhau.\n",
"Một bộ dữ liệu thường được sử dụng khi học máy là [MNIST](https://en.wikipedia.org/wiki/MNIST_database). Bộ dữ liệu này được tạo bởi Viện Tiêu chuẩn và Công nghệ Quốc gia Sửa đổi (Modified National Institute of Standards and Technology), và chứa một tập huấn luyện gồm 60.000 chữ số viết tay, được thu thập từ khoảng 250 sinh viên và nhân viên của viện. Ngoài ra còn có một tập dữ liệu kiểm tra gồm 10.000 chữ số, được thu thập từ các cá nhân khác nhau.\n",
"\n",
"Tất cả các chữ số được biểu diễn dưới dạng hình ảnh thang độ xám có kích thước 28x28 pixel.\n",
"Tất cả các chữ số được biểu diễn bằng hình ảnh thang độ xám có kích thước 28x28 pixel.\n",
"\n",
"> Tập dữ liệu MNIST có sẵn dưới dạng một cuộc thi huấn luyện trên [Kaggle](https://www.kaggle.com/c/digit-recognizer), một trang web tổ chức các cuộc thi và thử thách về học máy. Sau khi bạn học cách phân loại các chữ số MNIST, bạn có thể gửi giải pháp của mình lên Kaggle để xem nó được xếp hạng như thế nào so với các thí sinh khác.\n",
"> Bộ dữ liệu MNIST có sẵn dưới dạng một cuộc thi huấn luyện trên [Kaggle](https://www.kaggle.com/c/digit-recognizer), một trang web tổ chức các cuộc thi và thử thách về học máy. Sau khi bạn học cách phân loại chữ số MNIST, bạn có thể gửi giải pháp của mình lên Kaggle để xem nó được đánh giá như thế nào so với các người tham gia khác.\n",
"\n",
"Chúng ta bắt đầu bằng cách tải tập dữ liệu MNIST:\n"
"Chúng ta bắt đầu bằng cách tải bộ dữ liệu MNIST:\n"
]
},
{
@ -642,7 +644,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Bây giờ chúng ta hãy vẽ biểu đồ tập dữ liệu:\n"
"Bây giờ hãy vẽ biểu đồ tập dữ liệu:\n"
]
},
{
@ -829,9 +831,9 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Hãy lưu ý rằng độ chính xác tăng lên gần như 100% rất nhanh.\n",
"Xin lưu ý rằng độ chính xác tăng lên gần 100% rất nhanh.\n",
"\n",
"Vui lòng di chuyển thanh trượt đến một vị trí gần cuối quá trình huấn luyện và quan sát ma trận trọng số được vẽ ở bên trái. Ma trận này sẽ giúp bạn hiểu cách perceptron thực sự hoạt động. Bạn có thể thấy các giá trị trọng số cao ở giữa trường, tương ứng với các pixel thường xuất hiện cho chữ số 1, và các giá trị âm thấp ở hai bên, nơi có các phần của chữ số 0. Vì vậy, nếu chữ số được đưa vào perceptron thực sự là 1, phần giữa của nó sẽ được nhân với các giá trị cao, tạo ra kết quả dương. Ngược lại, khi perceptron quan sát chữ số 0, các pixel tương ứng sẽ được nhân với các số âm.\n",
"Vui lòng di chuyển thanh trượt đến một vị trí gần cuối quá trình huấn luyện và quan sát ma trận trọng số được hiển thị ở bên trái. Ma trận này sẽ giúp bạn hiểu cách perceptron thực sự hoạt động. Bạn có thể thấy các giá trị trọng số cao ở giữa trường, tương ứng với các pixel thường xuất hiện chữ số 1, và các giá trị âm thấp ở hai bên, nơi các phần của chữ số 0 nằm. Vì vậy, nếu chữ số được đưa vào perceptron thực sự là 1, phần giữa của nó sẽ được nhân với các giá trị cao, tạo ra kết quả dương. Ngược lại, khi perceptron quan sát chữ số 0, các pixel tương ứng sẽ được nhân với các số âm.\n",
"\n",
"> Bạn có thể nhận thấy rằng nếu chúng ta đưa cho perceptron một chữ số 1 hơi lệch sang ngang, sao cho các pixel của nó chiếm vị trí nơi có các phần dọc của chữ số 0, chúng ta có thể nhận được kết quả không chính xác. Vì bản chất của tập dữ liệu MNIST là tất cả các chữ số đều được căn giữa và định vị đúng cách, và perceptron dựa vào điều này để phân biệt giữa các chữ số.\n",
"\n",
@ -911,11 +913,11 @@
"source": [
"## Thảo luận\n",
"\n",
"Vì một lý do nào đó, 2 và 5 không dễ dàng tách biệt. Mặc dù chúng ta đạt được độ chính xác tương đối cao (trên 85%), nhưng rõ ràng có thể thấy perceptron ngừng học tại một thời điểm nào đó.\n",
"Vì lý do nào đó, số 2 và số 5 không dễ dàng tách biệt. Mặc dù chúng ta đạt được độ chính xác tương đối cao (trên 85%), nhưng có thể thấy rõ rằng perceptron ngừng học tại một thời điểm nào đó.\n",
"\n",
"Để hiểu tại sao điều này xảy ra, chúng ta có thể thử sử dụng [Phân tích Thành phần Chính](https://en.wikipedia.org/wiki/Principal_component_analysis) (PCA). Đây là một kỹ thuật học máy được sử dụng để giảm số chiều của tập dữ liệu đầu vào, theo cách nhằm đạt được sự tách biệt tốt nhất giữa các lớp.\n",
"Để hiểu tại sao điều này xảy ra, chúng ta có thể thử sử dụng [Phân tích Thành phần Chính](https://en.wikipedia.org/wiki/Principal_component_analysis) (PCA). Đây là một kỹ thuật học máy được sử dụng để giảm số chiều của tập dữ liệu đầu vào, nhằm đạt được sự phân tách tốt nhất giữa các lớp.\n",
"\n",
"Trong trường hợp của chúng ta, một hình ảnh đầu vào có 784 pixel (các đặc trưng đầu vào), và chúng ta muốn sử dụng PCA để giảm số lượng tham số xuống chỉ còn 2, để có thể vẽ chúng trên đồ thị. Hai tham số này sẽ là một tổ hợp tuyến tính của các đặc trưng ban đầu, và chúng ta có thể xem quy trình này như \"xoay\" không gian 784 chiều ban đầu và quan sát sự chiếu của nó lên không gian 2D, cho đến khi chúng ta có được góc nhìn tốt nhất để tách biệt các lớp.\n"
"Trong trường hợp của chúng ta, một hình ảnh đầu vào có 784 pixel (các đặc trưng đầu vào), và chúng ta muốn sử dụng PCA để giảm số lượng tham số xuống chỉ còn 2, để có thể vẽ chúng trên biểu đồ. Hai tham số này sẽ là sự kết hợp tuyến tính của các đặc trưng ban đầu, và chúng ta có thể xem quy trình này như việc \"xoay\" không gian 784 chiều ban đầu và quan sát sự chiếu của nó lên không gian 2 chiều, cho đến khi chúng ta có được góc nhìn tốt nhất để tách biệt các lớp.\n"
]
},
{
@ -1025,33 +1027,33 @@
}
},
"source": [
"Như bạn có thể thấy, số 0 và 1 có thể được tách biệt rõ ràng bằng một đường thẳng. Điều này cho thấy rằng trong không gian 784 chiều ban đầu, các điểm tương ứng với các chữ số cũng có thể được tách biệt tuyến tính. Trong trường hợp của số 2 và 5, chúng ta không thể tìm được phép chiếu tốt để tách biệt rõ ràng các chữ số, và do đó có một số trường hợp phân loại sai.\n",
"Như bạn có thể thấy, số 0 và 1 có thể được phân tách rõ ràng bằng một đường thẳng. Điều này cho thấy rằng trong không gian 784 chiều ban đầu, các điểm tương ứng với các chữ số cũng có thể được phân tách tuyến tính. Trong trường hợp của số 2 và 5, chúng ta không thể tìm được phép chiếu tốt để phân tách các chữ số một cách rõ ràng, và do đó có một số trường hợp phân loại sai.\n",
"\n",
"> Sau này trong khóa học này, chúng ta sẽ học cách tạo các bộ phân loại phi tuyến tính bằng cách sử dụng Mạng Neural, và cách xử lý vấn đề các chữ số không được căn chỉnh đúng cách. Rất nhanh chóng, chúng ta sẽ đạt độ chính xác trên 99% trong việc phân loại chữ số MNIST, khi phân loại chúng thành 10 lớp khác nhau.\n",
"> Sau này trong khóa học này, chúng ta sẽ học cách tạo các bộ phân loại phi tuyến tính bằng cách sử dụng Mạng Neural, và cách xử lý vấn đề các chữ số không được căn chỉnh đúng. Rất sớm thôi, chúng ta sẽ đạt được độ chính xác trên 99% trong việc phân loại chữ số MNIST, khi phân loại chúng thành 10 lớp khác nhau.\n",
"\n",
"## Kết luận\n",
"\n",
" * Chúng ta đã tìm hiểu về kiến trúc mạng neural đơn giản nhất - perceptron một lớp.\n",
" * Chúng ta đã tự triển khai perceptron, sử dụng quy trình huấn luyện đơn giản dựa trên gradient descent.\n",
" * Mặc dù đơn giản, perceptron một lớp có thể giải quyết các vấn đề khá phức tạp về nhận dạng chữ số viết tay.\n",
" * Perceptron một lớp là một bộ phân loại tuyến tính, và do đó nó cung cấp khả năng phân loại tương tự như hồi quy logistic.\n",
" * Trong không gian mẫu, perceptron có thể tách biệt hai lớp dữ liệu đầu vào bằng siêu phẳng.\n"
" * Perceptron một lớp là một bộ phân loại tuyến tính, và do đó nó cung cấp khả năng phân loại tương tự như logistic regression.\n",
" * Trong không gian mẫu, perceptron có thể phân tách hai lớp dữ liệu đầu vào bằng siêu phẳng.\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Ghi nhận công lao\n",
"## Tín dụng\n",
"\n",
"Notebook này là một phần của [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners), và được chuẩn bị bởi [Dmitry Soshnikov](http://soshnikov.com). Nó được lấy cảm hứng từ Hội thảo Mạng Nơ-ron tại Microsoft Research Cambridge. Một số mã nguồn và tài liệu minh họa được lấy từ các bài thuyết trình của [Katja Hoffmann](https://www.microsoft.com/en-us/research/people/kahofman/), [Matthew Johnson](https://www.microsoft.com/en-us/research/people/matjoh/) và [Ryoto Tomioka](https://www.microsoft.com/en-us/research/people/ryoto/), cũng như từ kho lưu trữ [NeuroWorkshop](http://github.com/shwars/NeuroWorkshop).\n"
"Notebook này là một phần của [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners), và được chuẩn bị bởi [Dmitry Soshnikov](http://soshnikov.com). Nó được lấy cảm hứng từ Hội thảo Mạng Nơ-ron tại Microsoft Research Cambridge. Một số mã và tài liệu minh họa được lấy từ các bài thuyết trình của [Katja Hoffmann](https://www.microsoft.com/en-us/research/people/kahofman/), [Matthew Johnson](https://www.microsoft.com/en-us/research/people/matjoh/) và [Ryoto Tomioka](https://www.microsoft.com/en-us/research/people/ryoto/), cũng như từ kho lưu trữ [NeuroWorkshop](http://github.com/shwars/NeuroWorkshop).\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Tuyên bố miễn trừ trách nhiệm**: \nTài liệu này đã được dịch bằng dịch vụ dịch thuật AI [Co-op Translator](https://github.com/Azure/co-op-translator). Mặc dù chúng tôi cố gắng đảm bảo độ chính xác, xin lưu ý rằng các bản dịch tự động có thể chứa lỗi hoặc không chính xác. Tài liệu gốc bằng ngôn ngữ bản địa nên được coi là nguồn tham khảo chính thức. Đối với các thông tin quan trọng, chúng tôi khuyến nghị sử dụng dịch vụ dịch thuật chuyên nghiệp từ con người. Chúng tôi không chịu trách nhiệm cho bất kỳ sự hiểu lầm hoặc diễn giải sai nào phát sinh từ việc sử dụng bản dịch này.\n"
"\n---\n\n**Tuyên bố miễn trừ trách nhiệm**: \nTài liệu này đã được dịch bằng dịch vụ dịch thuật AI [Co-op Translator](https://github.com/Azure/co-op-translator). Mặc dù chúng tôi cố gắng đảm bảo độ chính xác, xin lưu ý rằng các bản dịch tự động có thể chứa lỗi hoặc không chính xác. Tài liệu gốc bằng ngôn ngữ bản địa nên được coi là nguồn thông tin chính thức. Đối với thông tin quan trọng, nên sử dụng dịch vụ dịch thuật chuyên nghiệp của con người. Chúng tôi không chịu trách nhiệm cho bất kỳ sự hiểu lầm hoặc diễn giải sai nào phát sinh từ việc sử dụng bản dịch này.\n"
]
}
],
@ -1080,8 +1082,8 @@
"start_slideshow_at": "selected"
},
"coopTranslator": {
"original_hash": "914fc55f59efc7e17b8130d4033ac617",
"translation_date": "2025-08-29T14:57:53+00:00",
"original_hash": "d67e5b54ba20b507aa88d71aa3d042d8",
"translation_date": "2025-10-03T13:35:06+00:00",
"source_file": "lessons/3-NeuralNetworks/03-Perceptron/Perceptron.ipynb",
"language_code": "vi"
}

View File

@ -11,9 +11,9 @@
"source": [
"## 感知器\n",
"\n",
"> 本笔记本是 [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners) 的一部分。访问该仓库以获取完整的学习资料。\n",
"> 本笔记本是 [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners) 的一部分。访问该仓库以获取完整的学习资料。\n",
"\n",
"正如我们所讨论的,感知器可以用来解决**二分类问题**,即将输入样本分类为两个类别——我们可以称它们为**正类**和**负类**。\n",
"正如我们所讨论的,感知器可以帮助解决**二分类问题**,即将输入样本分类为两个类别——我们可以称它们为**正类**和**负类**。\n",
"\n",
"首先,让我们导入一些必要的库。\n"
]
@ -49,7 +49,7 @@
"source": [
"## 玩具问题\n",
"\n",
"首先,让我们从一个玩具问题开始,这个问题有两个输入特征。例如,在医学,我们可能希望根据肿瘤的大小和年龄将其分类为良性或恶性。\n",
"首先,让我们从一个玩具问题开始,这个问题有两个输入特征。例如,在医学领域,我们可能希望根据肿瘤的大小和年龄将其分类为良性或恶性。\n",
"\n",
"我们将使用 SciKit Learn 库中的 `make_classification` 函数生成一个随机分类数据集:\n"
]
@ -158,7 +158,7 @@
"\n",
"$$y(\\mathbf{x}) = f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x})$$\n",
"\n",
"其中 $\\mathbf{w}$ 是权重向量,$f$ 是阶跃激活函数:\n",
"其中$\\mathbf{w}$ 是权重向量,$f$ 是阶跃激活函数:\n",
"$$\n",
"f(x) = \\begin{cases}\n",
" +1 & x \\geq 0 \\\\\n",
@ -166,7 +166,7 @@
" \\end{cases} \\\\\n",
"$$\n",
"\n",
"然而,一个通用的线性模型通常还需要一个偏置项,即理想情况下我们应该计算 $y$ 为 $y=f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}+\\mathbf{b})$。为了简化我们的模型,我们可以通过在输入特征中添加一个始终等于 1 的维度来去掉这个偏置项:\n"
"然而,一个通用的线性模型通常还应该包含一个偏置项,即理想情况下我们应该计算 $y$ 为 $y=f(\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}+\\mathbf{b})$。为了简化我们的模型,我们可以通过在输入特征中添加一个始终等于 1 的维度来去掉这个偏置项:\n"
]
},
{
@ -210,16 +210,16 @@
"\n",
"$$E(\\mathbf{w}) = -\\sum_{n \\in \\mathcal{M}}\\mathbf{w}^{\\mathrm{T}}\\mathbf{x}_{n}t_{n}$$\n",
" \n",
" * $t_{n} \\in \\{-1, +1\\}$ 分别表示负样本和正样本\n",
" * $t_{n} \\in \\{-1, +1\\}$ 分别表示负样本和正样本的标签\n",
" * $\\mathcal{M}$ - 被错误分类的样本集合\n",
" \n",
"我们将使用**梯度下降**的过程。从一些初始的随机权重 $\\mathbf{w}^{(0)}$ 开始,在训练的每一步中,我们将使用 $E$ 的梯度来调整权重:\n",
"我们将使用**梯度下降**过程。从一些初始随机权重 $\\mathbf{w}^{(0)}$ 开始,我们将在训练的每一步通过误差 $E$ 的梯度来调整权重:\n",
"\n",
"$$\\mathbf{w}^{\\tau + 1}=\\mathbf{w}^{\\tau} - \\eta \\nabla E(\\mathbf{w}) = \\mathbf{w}^{\\tau} + \\eta\\sum_{n \\in \\mathcal{M}}\\mathbf{x}_{n} t_{n}$$\n",
"\n",
"其中$\\eta$ 是**学习率**$\\tau\\in\\mathbb{N}$ 表示迭代次数。\n",
"其中 $\\eta$ 是**学习率**$\\tau\\in\\mathbb{N}$ 表示迭代次数。\n",
"\n",
"我们用 Python 定义这个算法:\n"
"我们用 Python 定义这个算法:\n"
]
},
{
@ -271,7 +271,9 @@
{
"cell_type": "markdown",
"metadata": {},
"source": []
"source": [
"现在让我们在我们的数据集上运行训练:\n"
]
},
{
"cell_type": "code",
@ -309,9 +311,9 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"正如你所看到的初始准确率大约是50%但它会迅速提高到接近90%的较高值。\n",
"如你所见,初始准确率大约是 50%,但很快就提升到接近 90% 的较高值。\n",
"\n",
"让我们来可视化类的分隔情况。我们的分类函数形式为 $\\mathbf{w}^Tx$对于一个类别它的值大于0对于另一个类别它的值小于0。因此类的分隔线由 $\\mathbf{w}^Tx = 0$ 定义。由于我们只有两个维度 $x_0$ 和 $x_1$,这条线的方程为 $w_0x_0+w_1x_1+w_2 = 0$(记住我们显式定义了一个额外的维度 $x_2=1$)。让我们绘制这条线:\n"
"现在我们来可视化类别是如何分开的。我们的分类函数形式为 $\\mathbf{w}^Tx$,对于一个类别,它的值大于 0而对于另一个类别它的值小于 0。因此类别分界线由 $\\mathbf{w}^Tx = 0$ 定义。由于我们只有两个维度 $x_0$ 和 $x_1$,这条线的方程可以写成 $w_0x_0+w_1x_1+w_2 = 0$(记住我们显式地定义了一个额外的维度 $x_2=1$)。现在我们来绘制这条线:\n"
]
},
{
@ -379,7 +381,7 @@
"source": [
"## 在测试数据集上评估\n",
"\n",
"一开始,我们将部分数据分离出来作为测试数据集。现在来看看我们的分类器在这个测试数据集上的准确性。为此,我们需要对测试数据集进行扩展,增加一个额外的维度,然后与权重矩阵相乘,并确保得到的值与标签的符号一致(+1 或 -1。接着我们将所有布尔值相加再除以测试样本的长度计算准确率:\n"
"一开始,我们将部分数据分离出来作为测试数据集。现在来看看我们的分类器在这个测试数据集上的准确性如何。为此,我们需要将测试数据集扩展一个额外的维度,与权重矩阵相乘,并确保得到的值与标签的符号一致(+1 或 -1。然后将所有布尔值相加并除以测试样本的长度计算准确率:\n"
]
},
{
@ -420,7 +422,7 @@
"source": [
"## 观察训练过程\n",
"\n",
"我们之前已经看到,训练过程中准确率会下降。能够观察分线在训练过程中的变化会很有趣。下面的代码会将所有内容可视化到一个图表上,你可以通过移动滑块来“穿越时间”,查看训练过程中的变化。\n"
"我们之前已经看到,训练过程中准确率会下降。能够观察分线在训练过程中的变化会很有趣。下面的代码会将所有内容可视化到一个图表上,你可以通过滑动条来“穿越时间”,查看训练过程中的变化。\n"
]
},
{
@ -527,9 +529,9 @@
"source": [
"## 感知器的局限性\n",
"\n",
"如上所述,感知器是一种**线性分类器**。如果两个类别是**线性可分**的,也就是说可以用一条直线分开,那么感知器可以很好地区分它们。否则,感知器的训练过程将无法收敛。\n",
"如上所述,感知器是一种**线性分类器**。如果两个类别是**线性可分的**,即可以用一条直线分开,那么感知器可以很好地区分它们。否则,感知器的训练过程将无法收敛。\n",
"\n",
"一个最明显的例子是感知器无法解决的问题,即所谓的**XOR问题**。我们希望感知器能够学习XOR布尔函数其真值表如下\n",
"一个最明显的例子是感知器无法解决的问题,即所谓的**XOR问题**。我们希望感知器学习XOR布尔函数其真值表如下\n",
"\n",
"| | 0 | 1 |\n",
"|---|---|---|\n",
@ -603,21 +605,21 @@
}
},
"source": [
"正如上图所示,准确率从未超过75%,因为不可能画出一条直线来正确分类所有可能的样本。\n",
"正如上图所示,准确率从未超过 75%,因为不可能画出一条直线,使得所有可能的样本都被正确分类。\n",
"\n",
"XOR问题是感知机局限性的经典例子这一问题由Marvin Minsky和Seymour Papert在1969年的著作[《感知机》](https://en.wikipedia.org/wiki/Perceptrons_(book))中指出。这一观察限制了神经网络领域的研究近10年,尽管——我们将在课程的下一部分看到——多层感知机完全能够解决此类问题。\n",
"XOR 问题是感知机局限性的经典例子,这一问题在 1969 年由 Marvin Minsky 和 Seymour Papert 在他们的书籍 [Perceptrons](https://en.wikipedia.org/wiki/Perceptrons_(book)) 中提出。这一观察结果限制了神经网络领域的研究近 10 年,尽管——我们将在课程的下一部分看到——多层感知机完全能够解决此类问题。\n",
"\n",
"## 复杂示例 - MNIST\n",
"\n",
"尽管感知机无法解决XOR问题但它可以解决许多更复杂的问题例如手写字符识别。\n",
"尽管感知机无法解决 XOR 问题,但它可以解决许多更复杂的问题,例如手写字符识别。\n",
"\n",
"一个常用于学习机器学习的数据集叫做[MNIST](https://en.wikipedia.org/wiki/MNIST_database)。该数据集由美国国家标准与技术研究院Modified National Institute of Standards and Technology创建包含一个由60000个手写数字组成的训练集这些数字来自约250名学生和研究院员工。此外还有一个由10000个手写数字组成的测试集,这些数字来自不同的个人。\n",
"一个在学习机器学习时经常使用的数据集是 [MNIST](https://en.wikipedia.org/wiki/MNIST_database)。该数据集由美国国家标准与技术研究院 (Modified National Institute of Standards and Technology) 创建,包含一个由 60000 个手写数字组成的训练集,这些数字来自大约 250 名学生和研究所员工。此外,还有一个由 10000 个数字组成的测试数据集,这些数字来自不同的个人。\n",
"\n",
"所有数字都以28x28像素的灰度图像表示。\n",
"所有数字均以 28x28 像素的灰度图像表示。\n",
"\n",
"> MNIST数据集作为一个训练竞赛可在[Kaggle](https://www.kaggle.com/c/digit-recognizer)上找到Kaggle是一个举办机器学习竞赛和比赛的网站。一旦你学会如何分类MNIST数字可以将你的解决方案提交到Kaggle看看它在其他参与者中的排名。\n",
"> MNIST 数据集作为一个训练竞赛可在 [Kaggle](https://www.kaggle.com/c/digit-recognizer) 上找到。Kaggle 是一个举办机器学习竞赛和比赛的网站。一旦你学会了如何对 MNIST 数据集中的数字进行分类,你可以将你的解决方案提交到 Kaggle看看你的成绩在其他参与者中排名如何。\n",
"\n",
"我们从加载MNIST数据集开始\n"
"我们从加载 MNIST 数据集开始:\n"
]
},
{
@ -693,7 +695,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"因为感知器是一个二分类器,我们将把问题限制为识别两个数字。下面的函数将用两个给定的数字填充正样本和负样本数组(并且还会显示这些数字的样本以便于理解)。\n"
"因为感知器是一个二分类器,我们将把问题限制为识别两个数字。下面的函数将用两个给定的数字填充正样本和负样本数组(并且还会显示这些数字的样本以便于理解)。\n"
]
},
{
@ -733,7 +735,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"我们将从尝试在 0 1 之间进行分类开始:\n"
"我们将从尝试在0和1之间进行分类开始\n"
]
},
{
@ -831,9 +833,9 @@
"source": [
"请注意准确率会非常快地接近100%。\n",
"\n",
"请将滑块移动到训练接近尾声的位置,并观察左侧绘制的权重矩阵。这个矩阵可以帮助你理解感知器的实际工作原理。你会看到矩阵中间部分的权重值很高这对应于数字1通常会出现的像素位置而两侧的权重值较低甚至为负这对应于数字0的部分。因此如果输入给感知器的数字确实是1中间部分的像素会与高权重值相乘从而产生正结果。相反当感知器观察到数字0时相应的像素会与负权重值相乘。\n",
"请将滑块移动到训练后期的某个位置,并观察左侧绘制的权重矩阵。这个矩阵可以帮助你理解感知器的实际工作原理。你会看到字段中间的权重值很高这些值对应于数字1通常出现的像素而两侧的权重值较低甚至为负这些区域通常是数字0的一部分。因此如果呈现给感知器的数字确实是1中间部分的像素会与高权重值相乘产生正结果。相反当感知器观察到数字0时相应的像素会与负相乘。\n",
"\n",
"> 你可能会注意到如果我们给感知器一个稍微水平偏移的数字1使得它的像素占据了数字0的垂直部分位置我们可能会得到错误的结果。这是因为MNIST数据集的特点是所有数字都居中且位置正确感知器依赖这一点来区分数字。\n",
"> 你可能会注意到如果我们给感知器一个稍微水平偏移的数字1使其像素占据了数字0的垂直部分位置我们可能会得到错误的结果。由于MNIST数据集的特点是所有数字都居中并正确定位感知器依赖这一点来区分数字。\n",
"\n",
"现在让我们尝试不同的数字:\n"
]
@ -911,11 +913,11 @@
"source": [
"## 讨论\n",
"\n",
"出于某种原因2 和 5 并不容易完全分开。尽管我们获得了相对较高的准确率(超过 85%),但我们可以清楚地看到感知器在某个点停止了学习。\n",
"由于某些原因,数字 2 和 5 并不容易区分。尽管我们获得了相对较高的准确率(超过 85%),但我们可以明显看到感知器在某个点停止了学习。\n",
"\n",
"为了理解为什么会发生这种情况,我们可以尝试使用[主成分分析](https://en.wikipedia.org/wiki/Principal_component_analysis) (PCA)。这是一种机器学习技术,用于降低输入数据集的维度,从而在类之间获得最佳的可分性。\n",
"为了理解为什么会发生这种情况,我们可以尝试使用 [主成分分析](https://en.wikipedia.org/wiki/Principal_component_analysis) (PCA)。这是一种机器学习技术,用于降低输入数据集的维度,以便获得类别之间的最佳可分性。\n",
"\n",
"在我们的例中,输入图像有 784 个像素(输入特征),我们希望使用 PCA 将参数数量减少到仅 2 个,以便可以在图表上绘制它们。这两个参数将是原始特征的线性组合,我们可以将这一过程视为“旋转”原始的 784 维空间,并观察其在二维空间中的投影,直到我们获得最佳视角来分离这些类别。\n"
"在我们的例中,输入图像有 784 个像素(输入特征),我们希望使用 PCA 将参数数量减少到仅 2 个,以便可以在图表上绘制它们。这两个参数将是原始特征的线性组合,我们可以将这一过程视为“旋转”原始的 784 维空间,并观察其在二维空间中的投影,直到我们获得最佳视图来区分类别。\n"
]
},
{
@ -1025,17 +1027,17 @@
}
},
"source": [
"正如你所0 和 1 可以通过一条直线清晰地分开。这表明在原始的 784 维空间中,代表数字的点也是线性可分的。而对于 2 和 5我们无法找到一个能够清晰分开这两个数字的良好投影,因此会出现一些错误分类的情况。\n",
"正如你所看到的,数字 0 和 1 可以通过一条直线清晰地分开。这表明在原始的 784 维空间中,与这些数字对应的点也是线性可分的。而对于数字 2 和 5我们无法找到一个好的投影来清晰地分开这些数字,因此会出现一些错误分类的情况。\n",
"\n",
"> 在本课程后续内容中,我们将学习如何使用神经网络创建非线性分类器,以及如何处理数字未正确对齐的问题。很快我们将在 MNIST 数字分类中达到超过 99% 的准确率,同时将数字分类为 10 个不同的类别。\n",
"> 在后续课程中,我们将学习如何使用神经网络创建非线性分类器,以及如何处理数字未正确对齐的问题。很快我们将在 MNIST 数字分类中达到超过 99% 的准确率,同时将数字分类为 10 个不同的类别。\n",
"\n",
"## 关键点总结\n",
"## 关键点\n",
"\n",
" * 我们学习了最简单的神经网络架构——单层感知机。\n",
" * 我们通过手动实现了感知机,使用基于梯度下降的简单训练过程。\n",
" * 我们通过简单的基于梯度下降的训练过程,手动实现了感知机。\n",
" * 尽管简单,单层感知机可以解决相当复杂的手写数字识别问题。\n",
" * 单层感知机是一个线性分类器,因此它提供的分类能力与逻辑回归相同。\n",
" * 在样本空间中,感知机可以使用超平面分开两类输入数据。\n"
" * 在样本空间中,感知机可以通过超平面分隔输入数据的两个类别。\n"
]
},
{
@ -1044,14 +1046,14 @@
"source": [
"## 致谢\n",
"\n",
"本笔记本是 [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners) 的一部分,由 [Dmitry Soshnikov](http://soshnikov.com) 编写。灵感来源于微软剑桥研究院的神经网络研讨会。一些代码和示例材料来自 [Katja Hoffmann](https://www.microsoft.com/en-us/research/people/kahofman/)、[Matthew Johnson](https://www.microsoft.com/en-us/research/people/matjoh/) 和 [Ryoto Tomioka](https://www.microsoft.com/en-us/research/people/ryoto/) 的演示文稿,以及 [NeuroWorkshop](http://github.com/shwars/NeuroWorkshop) 仓库。\n"
"本笔记本是 [AI for Beginners Curricula](http://github.com/microsoft/ai-for-beginners) 的一部分,由 [Dmitry Soshnikov](http://soshnikov.com) 编写。灵感来源于微软剑桥研究院的神经网络研讨会。一些代码和示例材料来自 [Katja Hoffmann](https://www.microsoft.com/en-us/research/people/kahofman/)、[Matthew Johnson](https://www.microsoft.com/en-us/research/people/matjoh/) 和 [Ryoto Tomioka](https://www.microsoft.com/en-us/research/people/ryoto/) 的演示文稿,以及 [NeuroWorkshop](http://github.com/shwars/NeuroWorkshop) 仓库。\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**免责声明** \n本文档使用AI翻译服务 [Co-op Translator](https://github.com/Azure/co-op-translator) 进行翻译。尽管我们努力确保翻译的准确性,但请注意,自动翻译可能包含错误或不准确之处。原始语言的文档应被视为权威来源。对于关键信息,建议使用专业人工翻译。我们对因使用此翻译而产生的任何误解或误读承担责任。\n"
"\n---\n\n**免责声明** \n本文档使用AI翻译服务 [Co-op Translator](https://github.com/Azure/co-op-translator) 进行翻译。尽管我们努力确保翻译的准确性,但请注意,自动翻译可能包含错误或不准确之处。原始语言的文档应被视为权威来源。对于关键信息,建议使用专业人工翻译。我们对因使用此翻译而产生的任何误解或误读承担责任。\n"
]
}
],
@ -1080,8 +1082,8 @@
"start_slideshow_at": "selected"
},
"coopTranslator": {
"original_hash": "914fc55f59efc7e17b8130d4033ac617",
"translation_date": "2025-08-31T10:15:04+00:00",
"original_hash": "d67e5b54ba20b507aa88d71aa3d042d8",
"translation_date": "2025-10-03T13:10:59+00:00",
"source_file": "lessons/3-NeuralNetworks/03-Perceptron/Perceptron.ipynb",
"language_code": "zh"
}