ComplexityExplained[Farsi].pdf
5.7 MB
«در اتـم کربـن هیـچ عشقـی وجود ندارد، هیـچ طوفانـی در یک مولکول آب نیسـت، هیـچ فروپاشـی مالـی در یـک اسکناس دلار نیست.»
– پیتر دادز
کتابچه «شرح پیچیدگی» (ترجمه شده به فارسی) یک توضیح بسیار زیبا و مختصر از دانشی است که به اعتقاد هاوکینگ علم اصلی قرن پیش رو است. مطالعه سیستم های پیچیده از مغز گرفته تا هوش مصنوعی و بازارهای مالی همه و همه در این علم مطالعه می شوند.
لینک به وبسایت
وبسایت دیگری در مورد پیچیدگی
– پیتر دادز
کتابچه «شرح پیچیدگی» (ترجمه شده به فارسی) یک توضیح بسیار زیبا و مختصر از دانشی است که به اعتقاد هاوکینگ علم اصلی قرن پیش رو است. مطالعه سیستم های پیچیده از مغز گرفته تا هوش مصنوعی و بازارهای مالی همه و همه در این علم مطالعه می شوند.
لینک به وبسایت
وبسایت دیگری در مورد پیچیدگی
یکی از سخت ترین مراحل مقاله نوشتن یا هر نوشته علمی فرمول نویسی ست که بسیار طاقت فرساست. از طرفی نوشتن این فرمول ها بر روی کاغذ خیلی راحت است. ابزاری که استفاده میکنم و به بقیه هم بشدت توصیه میکنم در لینک زیر پیدا میکنید.
(خطاهای کوچکی هم میبینید به راحتی با یک دست خط بهتر 😁 یا اصلاح فرمول لاتک قابل حل هستند)
https://mathpix.com/
(خطاهای کوچکی هم میبینید به راحتی با یک دست خط بهتر 😁 یا اصلاح فرمول لاتک قابل حل هستند)
https://mathpix.com/
بدون شک مهمترین معماری شبکه ی عصبی دهه دوم این قرن در حوزه یادگیری ماشین transformers ها هستند (دهه اول دهه کانولوشن هاست). این معماری جدید آنقدر موفق عمل کرده است که منجر به ساختن قدرتمند ترین هوش مصنوعی حال حاضر یعنی gpt3 شده و کاربردهای آن حتی به حوزه پردازش تصویر رسیده است. بدون ترنسفورمر ها پردازش زبان طبیعی هنوز با مسایل بسیاری درگیر بود.
با اینکه مطالب بسیار زیادی در مورد این معماری نوشته شده است هنوز درک درستی از آن نداریم. نه به این خاطر که این معماری خودش پیچیده است بلکه به این خاطر که نمیدانیم چرا ساختار attention در آن خوب عمل میکند. به شخصه برای مدت ها برای من سوال بود که چرا اسم گذاری query key و value وجود دارد!
در این پست سعی کرده ام یافته های خودم را که از مطالعات گوناگون به دست آورده ام دسته بندی کنم و تاریخچه ای که پشت این مفهوم است را بررسی کنم و اصلا بفهمیم attention از کجا آمده و چرا اینقدر مهم است.
(پست به انگلیسی)
https://link.medium.com/GagdWVr529
با اینکه مطالب بسیار زیادی در مورد این معماری نوشته شده است هنوز درک درستی از آن نداریم. نه به این خاطر که این معماری خودش پیچیده است بلکه به این خاطر که نمیدانیم چرا ساختار attention در آن خوب عمل میکند. به شخصه برای مدت ها برای من سوال بود که چرا اسم گذاری query key و value وجود دارد!
در این پست سعی کرده ام یافته های خودم را که از مطالعات گوناگون به دست آورده ام دسته بندی کنم و تاریخچه ای که پشت این مفهوم است را بررسی کنم و اصلا بفهمیم attention از کجا آمده و چرا اینقدر مهم است.
(پست به انگلیسی)
https://link.medium.com/GagdWVr529
Medium
From Memory networks to Transformers
The attention mechanism is probably the most important idea in modern NLP. Even though it’s almost omnipresent in all-new architectures it…
اصلا چرا قاعده attention کار می کند. تفسیر ریاضی این مدل در کار جدید
Hopfield Network is all you need
یکی از زیبا ترین مقاله هایی ست که دیده ام. به جای خواندن مقاله می توانید خلاصه بلاگ زیر را هم بخوانید که توسط خود نویسنده ها منتشر شده است و حاوی همه لینک های مفید است.
https://ml-jku.github.io/hopfield-layers/
Hopfield Network is all you need
یکی از زیبا ترین مقاله هایی ست که دیده ام. به جای خواندن مقاله می توانید خلاصه بلاگ زیر را هم بخوانید که توسط خود نویسنده ها منتشر شده است و حاوی همه لینک های مفید است.
https://ml-jku.github.io/hopfield-layers/
چرا جهان می رقصد؟
تحلیل ریاضی پدیده sync و اینکه چرا همه جا هست. شبیه سازی در متلب ( به انگلیسی)
در جنبش اندرآور زلف عبرفشان را
در رقص اندرآور جانهای صوفیان را
خورشید و ماه و اختر رقصان بگرد چنبر
ما در میان رقصیم رقصان کن آن میان را
تحلیل ریاضی پدیده sync و اینکه چرا همه جا هست. شبیه سازی در متلب ( به انگلیسی)
در جنبش اندرآور زلف عبرفشان را
در رقص اندرآور جانهای صوفیان را
خورشید و ماه و اختر رقصان بگرد چنبر
ما در میان رقصیم رقصان کن آن میان را
Medium
Synchronization: The Sama dance of Nature
Sometimes things happen in our surroundings that we ignore easily but for a real scientist, they are seeds to further investigations. A…
This media is not supported in your browser
VIEW IN TELEGRAM
مدل جدید یادگیری عمیق با مدل سازی دینامیکی ریاضی نورون های واقعی موجوداتی به اسم seatworm (یا همان کرم روده!) توانسته تنها با ۱۹ نورون اتومبیل خودران را هدایت کند!!! این را مقایسه کنید با بهترین مدلهای کنونی یادگیری عمیق که نیاز به صدها هزار نورون و میلیاردها پارامتر دارند!
مدل جدید ساده. مقاوم به نویز و بسیار اسپارس است. همچنین مدل قابل تفسیر و فهم است و شبیه به شبکه های عمیق مانند یک جعبه سیاه نیست.
مقاله
پیپر
ویدیو
مدل جدید ساده. مقاوم به نویز و بسیار اسپارس است. همچنین مدل قابل تفسیر و فهم است و شبیه به شبکه های عمیق مانند یک جعبه سیاه نیست.
مقاله
پیپر
ویدیو
This media is not supported in your browser
VIEW IN TELEGRAM
تا حالا برای شما پیش آمده است که ترانه ای در ذهنتان هست اما بجز زمزمه ای از آن چیزی را به خاطر نمی آورید؟
سرچ جدید گوگل با تحلیل صدای زمزمه آهنگ مورد نظر را پیدا میکند!!
سرچ جدید گوگل با تحلیل صدای زمزمه آهنگ مورد نظر را پیدا میکند!!
اوبر کتابخانه ای به نام لودویگ را منتشر کرده است که نیاز به کد زدن برای یادگیری ماشین را حذف می کند! در واقع تنها چیزی که شما لازم است داشته باشید دیتاست و تایپ ورودی و خروجی است. بقیه کار را لودویگ انجام می دهد! این کتابخانه عمل پروتوتایپینگ را بسیار سریع می کند و نیاز به نوشتن کدهای طولانی یا پردازش های اضافه را حذف می کند. لودویگ با استفاده از سیستم تایپینگ خود متوجه می شود که شما دقیقا چه چیزی می خواهید به طور مثال اگر ورودی عکس و خروجی متن باشد شما image captioning می خواهید. اگر ورودی متن و خروجی عدد باشد احتمالا sentiment analysis لازم دارید!!
کتابخانه
ویدیوی معرفی
کتابخانه
ویدیوی معرفی
How to user Pytorch more efficiently? (by NVIDIA)
🔵In dataloader it’s almost always better to use pin_memory=true and num_worker>0
🔵If you have convolution followed by batch norm, set the bias in convolution to zero that has no effect on the result but makes everything faster.
🔵Use the param.grad=None instead of zero_grad()
model.zero_grad() ===> for param in model.parameters():
param.grad =None
🔵Using pytorch jit can fuse operations into one single CUDA kernel
Unfused point-wise operations are memory bound. They have to
Launch a separate CUDA kernel
Load data from global memory
Perform computation
Store results back into global memory
@torch.jit.script
def gelu(x):
Return x*0.5*(1+ torch.erf(x/1.41))
That decorator makes it much faster!
More here
slides
🔵In dataloader it’s almost always better to use pin_memory=true and num_worker>0
🔵If you have convolution followed by batch norm, set the bias in convolution to zero that has no effect on the result but makes everything faster.
🔵Use the param.grad=None instead of zero_grad()
model.zero_grad() ===> for param in model.parameters():
param.grad =None
🔵Using pytorch jit can fuse operations into one single CUDA kernel
Unfused point-wise operations are memory bound. They have to
Launch a separate CUDA kernel
Load data from global memory
Perform computation
Store results back into global memory
@torch.jit.script
def gelu(x):
Return x*0.5*(1+ torch.erf(x/1.41))
That decorator makes it much faster!
More here
slides
YouTube
PyTorch Performance Tuning Guide - Szymon Migacz, NVIDIA
ECCV 2020 Tutorial on Accelerating Computer Vision with Mixed PrecisionWebsite: https://nvlabs.github.io/eccv2020-mixed-precision-tutorial/Slides: https://nv...
🔵Some key notes on Installing Python🔵
Even though installing python seems easy there are a couple of problems that need to be addressed:
if you are on a Linux machine you probably have one version of python installed. you can check the version by typing python in the terminal. Sometimes other versions of python are also installed. You can check them all by checking
It is recommended to use python in virtual environments. The benefit of it is every time you install a library it will remain in that environment and doesn't change the global libraries that system or other projects might use. So you also need to install virtualenv
Even though installing python seems easy there are a couple of problems that need to be addressed:
if you are on a Linux machine you probably have one version of python installed. you can check the version by typing python in the terminal. Sometimes other versions of python are also installed. You can check them all by checking
/usr/bindirectory. If your desired version is not installed you can install them by using the following command (on a debian/ubuntu linux):
sudo add-apt-repository ppa:deadsnakes/ppaYou can replace python3.7 by other versions.
sudo apt install python3.7
It is recommended to use python in virtual environments. The benefit of it is every time you install a library it will remain in that environment and doesn't change the global libraries that system or other projects might use. So you also need to install virtualenv
sudo apt-get install python3-pipNow you can create a virtualenv with different versions of python. For example you can write:
sudo pip install virtualenv
virtualenv --python python2.7 venvFinally there is one more step that is needed for libraries that use C extensions. They need the tools to compile the c codes and this is needed for a lot of useful python libraries like lxml. For this purpose, you have to install python-dev
source venv/bin/activate
sudo apt install python3.7-devNote that you need to specify the version of the python-dev. Also you have to make sure the library you are currently using and has C extension is compatible with the python version you use.
MatlabTips via @vote
به کدام مطالب بیشتر علاقه دارید؟
public poll
متلب – 34
👍👍👍👍👍👍👍 47%
پایتورچ – 25
👍👍👍👍👍 35%
تنسرفلو – 9
👍👍 13%
نامپای و scikit-learn – 4
👍 6%
👥 72 people voted so far.
public poll
متلب – 34
👍👍👍👍👍👍👍 47%
پایتورچ – 25
👍👍👍👍👍 35%
تنسرفلو – 9
👍👍 13%
نامپای و scikit-learn – 4
👍 6%
👥 72 people voted so far.
🔵گسترش پایتون به سی🔵
یکی از ویژگی های بسیار خوب پایتون این است که به شما اجازه می دهد به راحتی آن را به زبان های دیگر مانند سی، سی پلاس پلاس، راست (Rust) و go گسترش بدهید. منظور از گسترش این است که شما مجبور نیست تمام کدها را در پایتون بنویسید بلکه می توانید بخشی از آن را در یک زبان دیگر بنویسید و از داخل پایتون آن ها را مانند یک کتابخانه فراخوانی کنید. اما اصلا چرا باید چنین کاری بکنیم؟
دلایل زیادی برای این کار وجود دارد که مهمترین آن ها کارآمدی یا سرعت است. بیشتر اوقات کدهای کامپایل شده ی زبان سی بسیار سریع تر اجرا می شوند. اساسا دلیل محبوبیت پایتون این بود که کتابخانه های بسیاری مانند نامپای توانستند حجم عظیمی از کدهای ناخوانا و سخت سی را که سرعت بالایی دارند به صورت سطح بالا در اختیار کاربران پایتون قرار دهند. چنین چیزی تقریبا برای هر کتابخانه ی جدی ای صادق است. مثال های دیگر آن کتابخانه های پایتورچ و تنسورفلو هستند.
شما شاید هرگز نیاز نداشته باشید که کدی به زبان سی بنویسید که از درون پایتون فراخوانی شود اما یاد گرفتن آن بسیار روشنگر است. برای اینکه متوجه می شوید وقتی یک کتابخانه با pip نصب می کنید و setup.py در حال اجرا است در عمل آن کتابخانه در حال کامپایل شدن است. در نهایت فایل .so که ساخته می شود از درون پایتون قابل صدا زدن است.
بر روی آزمایش های ساده ای که انجام دادم محاسبه یک فاکتوریل ساده با استفاده از کد سی تا صد برابر سریع تر است که جای تعجب ندارد اما این سرعت حتی زمانی که از درون پایتون فراخوانی می شود به همان اندازه سریع تر از کد پایتون معادل آن است! چنین افزایش سرعتی آنقدر وسوسه انگیز است که ممکن است بخواهید بخش هایی از کدهایتان را درون سی بنویسید و از پایتون فراخوانی کنید. در زیر یک کد برای این کار نوشته ام که می توانید دانلود و امتحان کنید
https://github.com/roholazandie/pythoncextension
یکی از ویژگی های بسیار خوب پایتون این است که به شما اجازه می دهد به راحتی آن را به زبان های دیگر مانند سی، سی پلاس پلاس، راست (Rust) و go گسترش بدهید. منظور از گسترش این است که شما مجبور نیست تمام کدها را در پایتون بنویسید بلکه می توانید بخشی از آن را در یک زبان دیگر بنویسید و از داخل پایتون آن ها را مانند یک کتابخانه فراخوانی کنید. اما اصلا چرا باید چنین کاری بکنیم؟
دلایل زیادی برای این کار وجود دارد که مهمترین آن ها کارآمدی یا سرعت است. بیشتر اوقات کدهای کامپایل شده ی زبان سی بسیار سریع تر اجرا می شوند. اساسا دلیل محبوبیت پایتون این بود که کتابخانه های بسیاری مانند نامپای توانستند حجم عظیمی از کدهای ناخوانا و سخت سی را که سرعت بالایی دارند به صورت سطح بالا در اختیار کاربران پایتون قرار دهند. چنین چیزی تقریبا برای هر کتابخانه ی جدی ای صادق است. مثال های دیگر آن کتابخانه های پایتورچ و تنسورفلو هستند.
شما شاید هرگز نیاز نداشته باشید که کدی به زبان سی بنویسید که از درون پایتون فراخوانی شود اما یاد گرفتن آن بسیار روشنگر است. برای اینکه متوجه می شوید وقتی یک کتابخانه با pip نصب می کنید و setup.py در حال اجرا است در عمل آن کتابخانه در حال کامپایل شدن است. در نهایت فایل .so که ساخته می شود از درون پایتون قابل صدا زدن است.
بر روی آزمایش های ساده ای که انجام دادم محاسبه یک فاکتوریل ساده با استفاده از کد سی تا صد برابر سریع تر است که جای تعجب ندارد اما این سرعت حتی زمانی که از درون پایتون فراخوانی می شود به همان اندازه سریع تر از کد پایتون معادل آن است! چنین افزایش سرعتی آنقدر وسوسه انگیز است که ممکن است بخواهید بخش هایی از کدهایتان را درون سی بنویسید و از پایتون فراخوانی کنید. در زیر یک کد برای این کار نوشته ام که می توانید دانلود و امتحان کنید
https://github.com/roholazandie/pythoncextension
GitHub
roholazandie/pythoncextension
Contribute to roholazandie/pythoncextension development by creating an account on GitHub.
نمودار های زنده با قابلیت صف بندی وظایف برای یک سیستم async
یکی از بهترین ویژگی های رابط کاربری جذاب این است که گزارش واقعی از میزان پیشرفت یک فرآیند سنگین ارائه بدهد. به طور مثال شما ممکن است یه وظیفه سنگین یادگیری ماشین داشته باشید و بخواهید از طریق رابط کاربری وبی بدانید که چقدر از کار انجام شده است. نمودارهای زنده (live charts) برای این منظور ساخته می شوند و برخلاف رسم های معمولی که کتابخانه های زیادی هم برایشان وجود دارند پیاده سازی آنها به هیچ وجه کار ساده و سر راستی نیست. این مورد بخصوص وقتی بیشتر مشخص می شود که بخواهید رابط های کاربری async بسازید. به این معنا که لایه GUI به صورت غیر همزمان با backend کار میکند. مثلا اگر شما یک دکمه بزنید که کار زمانبری را انجام بدهید باید همچنان قادر باشید یک نمودار میزان پیشرفت انجام کار ببینید یا به قسمت های دیگر برنامه یا وب اپ سر بزنید. ویژگی ای که بر روی خیلی از رابط های کاربری مانند streamlit یا django یا dash وجود ندارد.
برای انجام این کار نیاز به یک مدیر وظایف (task manager) دارید که کارهای ورودی به سیستم را صف بندی و منظم کند. پیاده سازی خود این کار بسیار پیچیده است به همین خاطر کتابخانه هایی مانند celery در پایتون انجام این کار را ساده تر می کنند. پروژه های بزرگ تری که نیاز به پخش بار محاسبه بر روی محیط ابر دارند نیز می توانند از چنین ابزارهایی استفاده کنند. وارد شدن در جزییات آن ها از حوصله این بحث خارج است. در اینجا یک کد نمونه که می تواند یک رابط کاربری async را همزمان با آپدیت زنده میزان پیشرفت را نشان دهد آورده ام
https://github.com/roholazandie/live_charts
یکی از بهترین ویژگی های رابط کاربری جذاب این است که گزارش واقعی از میزان پیشرفت یک فرآیند سنگین ارائه بدهد. به طور مثال شما ممکن است یه وظیفه سنگین یادگیری ماشین داشته باشید و بخواهید از طریق رابط کاربری وبی بدانید که چقدر از کار انجام شده است. نمودارهای زنده (live charts) برای این منظور ساخته می شوند و برخلاف رسم های معمولی که کتابخانه های زیادی هم برایشان وجود دارند پیاده سازی آنها به هیچ وجه کار ساده و سر راستی نیست. این مورد بخصوص وقتی بیشتر مشخص می شود که بخواهید رابط های کاربری async بسازید. به این معنا که لایه GUI به صورت غیر همزمان با backend کار میکند. مثلا اگر شما یک دکمه بزنید که کار زمانبری را انجام بدهید باید همچنان قادر باشید یک نمودار میزان پیشرفت انجام کار ببینید یا به قسمت های دیگر برنامه یا وب اپ سر بزنید. ویژگی ای که بر روی خیلی از رابط های کاربری مانند streamlit یا django یا dash وجود ندارد.
برای انجام این کار نیاز به یک مدیر وظایف (task manager) دارید که کارهای ورودی به سیستم را صف بندی و منظم کند. پیاده سازی خود این کار بسیار پیچیده است به همین خاطر کتابخانه هایی مانند celery در پایتون انجام این کار را ساده تر می کنند. پروژه های بزرگ تری که نیاز به پخش بار محاسبه بر روی محیط ابر دارند نیز می توانند از چنین ابزارهایی استفاده کنند. وارد شدن در جزییات آن ها از حوصله این بحث خارج است. در اینجا یک کد نمونه که می تواند یک رابط کاربری async را همزمان با آپدیت زنده میزان پیشرفت را نشان دهد آورده ام
https://github.com/roholazandie/live_charts
GitHub
roholazandie/live_charts
Contribute to roholazandie/live_charts development by creating an account on GitHub.
This media is not supported in your browser
VIEW IN TELEGRAM
Live update of a task with django backend, celery task manager and ajax calls from javascript in web UI
دوستی از طریق ایمیل از من سوالی پرسید که فکر کردم ممکن است برای خیلی ها پیش آمده باشد. من قطعا نمیتوانم ادعا کنم که جواب را به درستی میدانم اینجا فقط چیزهایی که به تجربه فهمیده ام یا از بقیه یاد گرفته ام را به اشتراک می گذارم:
سوال (نقل به مضمون): مشکل بزرگی که من همیشه دارم این است که احساس میکنم که انگار یکی دو فصل برنامه نویسی را جا گذاشته ام. مثلا در کدها طرف می گوید من اینجا سریالایزر استفاده کردم! من میگم سریالایزر چیه؟ خوب راهی که وجود داره فوری سرچ میکنم سریالایزر چیه؟ اما انگار پایانی وجود نداره. یا با کلی عذاب یک مشکل رو حل می کنم، یک کد طویل می نویسم و چرخ رو از اول اختراع می کنم، یه برنامه نویس حرفه ای در اولین نگاه میگه این چه کاریه کردی؟ این که با فلان چیز راحتتر بود! سوال اصلی این است که این مطالب را چرا اصلا من در هیچکدوم از آموزش های پایتونم باهاشون روبرو نشدم، اینها کجا هستند؟ کجا باید دنبال چیزهایی بگردم و یاد بگیرم که بدونم لااقل به اکثر پایتون آگاهی دارم.
سوال (نقل به مضمون): مشکل بزرگی که من همیشه دارم این است که احساس میکنم که انگار یکی دو فصل برنامه نویسی را جا گذاشته ام. مثلا در کدها طرف می گوید من اینجا سریالایزر استفاده کردم! من میگم سریالایزر چیه؟ خوب راهی که وجود داره فوری سرچ میکنم سریالایزر چیه؟ اما انگار پایانی وجود نداره. یا با کلی عذاب یک مشکل رو حل می کنم، یک کد طویل می نویسم و چرخ رو از اول اختراع می کنم، یه برنامه نویس حرفه ای در اولین نگاه میگه این چه کاریه کردی؟ این که با فلان چیز راحتتر بود! سوال اصلی این است که این مطالب را چرا اصلا من در هیچکدوم از آموزش های پایتونم باهاشون روبرو نشدم، اینها کجا هستند؟ کجا باید دنبال چیزهایی بگردم و یاد بگیرم که بدونم لااقل به اکثر پایتون آگاهی دارم.
اول باید بگویم که شما تنها نیستید من هم هر روز با مفاهیمی آشنا میشم که اصلا قبلا نشنیده ام. بنظرم این یکی از ویژگی های رشته ماست. بخصوص اینکه هر روز چیزهای جدیدی بهش اضافه میشه. بنابراین از جنبه استرس و نگرانی باید بگم که اصلا نگران نباشید همه تقریبا همین وضعیت را دارند فقط افراد مختلف در جاهای مختلفی از رشته شون هستند. من وقتی وارد فضای حرفه ای و کاری برنامه نویسی شدم همین مشکلات رو داشتم. هر روز چیزهایی میشنیدم که برام تازگی داشت. این به شدت گیج کننده و ناامید کننده ست. ولی دقیقا به همین خاطر هست که به کامپیوتری ها بیشتر پرداخت میکنن چون تعداد آدم های زیادی نیستند که سریع جا نزنن. توصیه من هم به شما اینه که به هیچ وجه نا امید نشید. اما برای اینکه راحتتر باشید من چند راهکاری که به ذهنم میرسه رو بهتون میگم دنبال کنید:
۱- قبل از هرچیزی باید کاملا با انگلیسی (حداقل در حد خواندن مطالب فنی ) راحت باشید. اگه بخوام رک باشم باید بگم با سرچ کردن مطالب فارسی یا دوره های فارسی به جایی نمیرسید. چون چنین منابعی محدود اکثرا قدیمی و حتی غلط هستند! باید به کلی از فارسی سرچ کردن پرهیز کنید و همیشه به دنبال منابع انگلیسی باشید.
۲- دنبال تصویر کلی باشید: اگه متوجه شدید چیزی رو نمیفهمید مثلا اتومیک توی دیتابیس فقط همون یک آیتم رو سرچ نکنید. چون چنین کاری باعث میشه هیچ وقت تصویر کلی نداشته باشید. اگه نمیدونید اتومیک چی هست احتمالا به این دلیل هست که درس دیتابیس رو خوب یاد نگرفتید! این به هیچ وجه بد نیست همه ما نقص در خواندن درسهامون داشتیم. حالا باید یک منبع خوب و تاکید میکنم «به روز» پیدا کنید و شروع کنید به مطالعه ش. حالا لازم نیست کل کتابش رو مثلا مطالعه کنید اگه اون فصلی که در مورد «ACID» توی دیتابیس هست رو بخونید کافیه. ولی اگه احساس میکنید هنوز تصویر کلی ندارید باید کل کتاب رو بخونید. با این روش هم مجبور نیستید وقتتون رو کامل روی فقط یه کتاب بذارید. من به شدت کتاب های نشر oreilly رو توصیه میکنم. سعی کنید پیگیر این نشر باشید.
۳- کنجکاوٍ فعال باشید: اگه فلان لایبرری کارتون رو راه انداخت به همین اکتفا نکنید: سعی کنید حداقل به صفحه اصلی اون لایببری برید و بفهمید که چطور کار میکنه. داخل کدهای لایببری برید و بالا پایینشون کنید! حتی میتونید دیباگشون کنید و متغیرهای داخلیشون رو ببنید یا حتی تغییرشون بدید!! این کنجکاوی فعال کمک میکنه به گوشه هایی از برنامه ها نرم افزارها و کتابخانه ها سر بزنید که بیشتر افراد نمیرن! این دقیقا مثل دو تا بچه ست که یکی با ماشین کنترلیش بازی میکنه و کارش رو راه میندازه و دومی که بازش میکنه و به دقت آرمیچر سیم ها و همه چیز رو چک میکنه و دستکاری میکنه تا بفهمه چطور کار میکنه! و حتی کارهای جالب تری باهاش بکنه!
۴- بهترین ابزار یادگیری ساختنه: اگه یه مفهوم رو میخونید سعی کنید پیاده سازیش کنید. مثلا میخونید کویک سورت چطور کار میکنه. قبل از اینکه سرچ کنید کدهاش رو برید و بسازیدش. به قول فاینمن: من فقط زمانی چیزی رو درک میکنم که بتونم بسازمش! اینطوری به تمام زوایایی که قبلا بهش فکر نمیکردید پی میبرید و دقیق تر میشید.
۵- چیزهایی که یاد گرفتید و براتون جذاب بوده رو به بقیه یاد بدید!! کسایی که بیشتر بلدن اونهایی هستن که بیشتر به بقیه یاد میدن! روشهای مختلفی هست برای اینکار از یاد دادن مستقیم، گذاشتن کد بر روی گیتهاب، نوشتن در موردش توی وبلاگ و توییتر و تلگرام و غیره. این کار علاوه به کمک به بقیه همچنین باعث میشه یه مجموعه و آرشیو خیلی خوب از کارهاتون داشته باشید که بعدا بهشون مراجعه کنید.
۶- پیگیر و علاقه مند باشید! سعی کنید سایت های مختلف برید و ببینید الان توی دنیا توی هر بخشی داره چه کارهایی انجام میشه. سعی کنید شما اون کسی باشه که به همکارش در مورد تکنولوژی های جدید میگه نه برعکس. برای این کار سایت زیاده. مثلا hackernews سایتهای پایتون realpython.com و غیره. یه روش عالی دیگه دنبال کردن آدم های حسابی از پژوهشگر ها تا برنامه نویس های مطرح دنیا توی توییتره. به تدریج یه شبکه بسیار مفید از آدم هایی رو میبینید که در مورد آخرین تکنولوژی ها حرف میزنن. کدهاشون رو شیر میکنن و غیره و غیره. و در نهایت بخش discover google search که بر اساس تاریخچه سرچ هاتون مطالب جالب و جدید از تمام وب براتون پیشنهاد میده!
۱- قبل از هرچیزی باید کاملا با انگلیسی (حداقل در حد خواندن مطالب فنی ) راحت باشید. اگه بخوام رک باشم باید بگم با سرچ کردن مطالب فارسی یا دوره های فارسی به جایی نمیرسید. چون چنین منابعی محدود اکثرا قدیمی و حتی غلط هستند! باید به کلی از فارسی سرچ کردن پرهیز کنید و همیشه به دنبال منابع انگلیسی باشید.
۲- دنبال تصویر کلی باشید: اگه متوجه شدید چیزی رو نمیفهمید مثلا اتومیک توی دیتابیس فقط همون یک آیتم رو سرچ نکنید. چون چنین کاری باعث میشه هیچ وقت تصویر کلی نداشته باشید. اگه نمیدونید اتومیک چی هست احتمالا به این دلیل هست که درس دیتابیس رو خوب یاد نگرفتید! این به هیچ وجه بد نیست همه ما نقص در خواندن درسهامون داشتیم. حالا باید یک منبع خوب و تاکید میکنم «به روز» پیدا کنید و شروع کنید به مطالعه ش. حالا لازم نیست کل کتابش رو مثلا مطالعه کنید اگه اون فصلی که در مورد «ACID» توی دیتابیس هست رو بخونید کافیه. ولی اگه احساس میکنید هنوز تصویر کلی ندارید باید کل کتاب رو بخونید. با این روش هم مجبور نیستید وقتتون رو کامل روی فقط یه کتاب بذارید. من به شدت کتاب های نشر oreilly رو توصیه میکنم. سعی کنید پیگیر این نشر باشید.
۳- کنجکاوٍ فعال باشید: اگه فلان لایبرری کارتون رو راه انداخت به همین اکتفا نکنید: سعی کنید حداقل به صفحه اصلی اون لایببری برید و بفهمید که چطور کار میکنه. داخل کدهای لایببری برید و بالا پایینشون کنید! حتی میتونید دیباگشون کنید و متغیرهای داخلیشون رو ببنید یا حتی تغییرشون بدید!! این کنجکاوی فعال کمک میکنه به گوشه هایی از برنامه ها نرم افزارها و کتابخانه ها سر بزنید که بیشتر افراد نمیرن! این دقیقا مثل دو تا بچه ست که یکی با ماشین کنترلیش بازی میکنه و کارش رو راه میندازه و دومی که بازش میکنه و به دقت آرمیچر سیم ها و همه چیز رو چک میکنه و دستکاری میکنه تا بفهمه چطور کار میکنه! و حتی کارهای جالب تری باهاش بکنه!
۴- بهترین ابزار یادگیری ساختنه: اگه یه مفهوم رو میخونید سعی کنید پیاده سازیش کنید. مثلا میخونید کویک سورت چطور کار میکنه. قبل از اینکه سرچ کنید کدهاش رو برید و بسازیدش. به قول فاینمن: من فقط زمانی چیزی رو درک میکنم که بتونم بسازمش! اینطوری به تمام زوایایی که قبلا بهش فکر نمیکردید پی میبرید و دقیق تر میشید.
۵- چیزهایی که یاد گرفتید و براتون جذاب بوده رو به بقیه یاد بدید!! کسایی که بیشتر بلدن اونهایی هستن که بیشتر به بقیه یاد میدن! روشهای مختلفی هست برای اینکار از یاد دادن مستقیم، گذاشتن کد بر روی گیتهاب، نوشتن در موردش توی وبلاگ و توییتر و تلگرام و غیره. این کار علاوه به کمک به بقیه همچنین باعث میشه یه مجموعه و آرشیو خیلی خوب از کارهاتون داشته باشید که بعدا بهشون مراجعه کنید.
۶- پیگیر و علاقه مند باشید! سعی کنید سایت های مختلف برید و ببینید الان توی دنیا توی هر بخشی داره چه کارهایی انجام میشه. سعی کنید شما اون کسی باشه که به همکارش در مورد تکنولوژی های جدید میگه نه برعکس. برای این کار سایت زیاده. مثلا hackernews سایتهای پایتون realpython.com و غیره. یه روش عالی دیگه دنبال کردن آدم های حسابی از پژوهشگر ها تا برنامه نویس های مطرح دنیا توی توییتره. به تدریج یه شبکه بسیار مفید از آدم هایی رو میبینید که در مورد آخرین تکنولوژی ها حرف میزنن. کدهاشون رو شیر میکنن و غیره و غیره. و در نهایت بخش discover google search که بر اساس تاریخچه سرچ هاتون مطالب جالب و جدید از تمام وب براتون پیشنهاد میده!
معرفی ابزار
یکی از دشوارترین بخش های کار در فضای مجازی امن نگه داشتن اکانت ها و اطلاعاتتان هست. فناوری های زیادی در این مورد توسعه داده شده اند که هر کدام کار را برای کاربر ساده تر کرده و امنیت را بالا ببرند. اما همچنان شاهد درزهای امنیتی و هک شدن اکانت ها هستیم. یکی از دلایل این اتفاق رعایت نکردن نکات ساده ای است که الان تقریبا همه میدانند. مثلا اگر وبسایت یا اکانت مورد نظر به شما امکان two step verification که با شماره موبایل است را میدهد حتما آن را فعال کنید. از طرفی همه ما شاید نزدیک به صدها اکانت داشته باشیم و برای آن ها تقریبا از یک یا دو پسورد استفاده میکنیم (چون واقعا نمیتوان همه را به خاطر سپرد) خیلی از این پسوردها امن نیستند چون ترکیبی از اسم و سال تولد و غیره هستند که حدس زدنشان برای الگوریتم ها ساده است. اما مشکل بزرگتر استفاده از یک پسورد همه جا این است که اگر فقط یکی از این وبسایت ها امنیت درستی نداشته باشد و پسوردهای کاربرانش لو برود هکر ها قادر خواهند بود به بقیه اکانت ها حمله کنند! بهترین راه برای مقابله با این کار استفاده از پسوردهای قدرتمند و مختلف است. اما چطور میتوان آن ها را به خاطر سپرد؟
یکی از بهترین راه ها استفاده از مدیر پسورد (password manager)ها مانند lastpass و dashlane است. این مدیرپسورد ها علاوه بر پیشنهاد پسوردهای واقعا رندم و قوی این امکان را میدهند که آن ها را به خاطر نسپارید چون به صورت اتوماتیک آن ها را برایتان پر میکنند! همچنین اگر بر روی گوشی وارد یک اپ یا وبسایت شوید اگر برنامه گوشی این مدیر پسوردها را داشته باشید باز هم از طریق biometric authenticaion (که اکثر گوشی های هوشمند دارند) وارد برنامه می شوید بدون اینکه پسوردی را به خاطر بسپارید. تغییر به چنین ابزارهایی امنیت شما را تا حد بسیار زیادی بالا میبرد و کار به خاطر سپردن پسورد ها را از دوشتان بر میدارد.
یکی از دشوارترین بخش های کار در فضای مجازی امن نگه داشتن اکانت ها و اطلاعاتتان هست. فناوری های زیادی در این مورد توسعه داده شده اند که هر کدام کار را برای کاربر ساده تر کرده و امنیت را بالا ببرند. اما همچنان شاهد درزهای امنیتی و هک شدن اکانت ها هستیم. یکی از دلایل این اتفاق رعایت نکردن نکات ساده ای است که الان تقریبا همه میدانند. مثلا اگر وبسایت یا اکانت مورد نظر به شما امکان two step verification که با شماره موبایل است را میدهد حتما آن را فعال کنید. از طرفی همه ما شاید نزدیک به صدها اکانت داشته باشیم و برای آن ها تقریبا از یک یا دو پسورد استفاده میکنیم (چون واقعا نمیتوان همه را به خاطر سپرد) خیلی از این پسوردها امن نیستند چون ترکیبی از اسم و سال تولد و غیره هستند که حدس زدنشان برای الگوریتم ها ساده است. اما مشکل بزرگتر استفاده از یک پسورد همه جا این است که اگر فقط یکی از این وبسایت ها امنیت درستی نداشته باشد و پسوردهای کاربرانش لو برود هکر ها قادر خواهند بود به بقیه اکانت ها حمله کنند! بهترین راه برای مقابله با این کار استفاده از پسوردهای قدرتمند و مختلف است. اما چطور میتوان آن ها را به خاطر سپرد؟
یکی از بهترین راه ها استفاده از مدیر پسورد (password manager)ها مانند lastpass و dashlane است. این مدیرپسورد ها علاوه بر پیشنهاد پسوردهای واقعا رندم و قوی این امکان را میدهند که آن ها را به خاطر نسپارید چون به صورت اتوماتیک آن ها را برایتان پر میکنند! همچنین اگر بر روی گوشی وارد یک اپ یا وبسایت شوید اگر برنامه گوشی این مدیر پسوردها را داشته باشید باز هم از طریق biometric authenticaion (که اکثر گوشی های هوشمند دارند) وارد برنامه می شوید بدون اینکه پسوردی را به خاطر بسپارید. تغییر به چنین ابزارهایی امنیت شما را تا حد بسیار زیادی بالا میبرد و کار به خاطر سپردن پسورد ها را از دوشتان بر میدارد.
Lastpass
#1 Password Manager & Vault App with Single-Sign On & MFA Solutions - LastPass
Go beyond saving passwords with the best password manager! Generate strong passwords and store them in a secure vault. Now with single-sign on (SSO) and adaptive MFA solutions that integrate with over 1,200 apps.
✅Two important points using pytorch (possible interview questions):
🔵what is the difference between model.zero_grad() and optimizer.zero_grad()?
They are the same IF you pass all the model parameters to the optimizer. In other words if you have:
🔵 what is the difference between model.eval() and torch.no_grad()?
-
-
In inference mode you should first call model.eval() and then loop over test dataloader in torch.no_grad()
🔵what is the difference between model.zero_grad() and optimizer.zero_grad()?
They are the same IF you pass all the model parameters to the optimizer. In other words if you have:
optimizer = optim.Adam(model.parameters(), ....)then calling
optimizer.zero_grad()is exactly has the same effect as
model.zero_grad()I found it is safer to call model.zero_grad() to make sure all grads are zero. but why we have two calls in the first place? The distinction is useful for people that have multiple models in the same optimizer, or multiple optimizer for different part of their model.
🔵 what is the difference between model.eval() and torch.no_grad()?
-
model.eval()will notify all your layers that you are in eval mode, that way, batchnorm or dropout layers will work in eval mode instead of training mode.
-
torch.no_grad()impacts the autograd engine and deactivate it. It will reduce memory usage and speed up computations but you won’t be able to backprop (which you don’t want in an eval script).
In inference mode you should first call model.eval() and then loop over test dataloader in torch.no_grad()