Dev Tweet – Telegram
Dev Tweet
850 subscribers
113 photos
15 videos
3 files
98 links
گعده‌ای در باب برنامه نویسی، پایتون، هوش مصنوعی و داده
Download Telegram
مسخره‌بازی!
این خانم یکی از مدیران OpenAI هست.
...
لابد GPT-6 هم در حد Post-Doc
و GPT-7 هم در حد Faculty هست
و GPT-8 هم در حد Tenure Faculty !
🤣10👍1🥰1
تعالی در AI!
بحثی مهم و پرمناقشه‌ای در هوش مصنوعی هست که می‌گوید آیا می‌شود که یک مدل یادگیری ماشین خودش از داده‌هایی که در اختیارش قرار می‌گیرد استفاده کند و به دانشی فراتر از دانش درون داده‌هایی ورودی دست پیدا کند، به این مفهوم پشت سر گذاشتن دانش درون داده ورودی تعالی (Transcendence) می‌گن، تعالی به معنی ارتقا یافتن از دانش درون داده ورودی است. این پدیده در مورد انسان عجیب نیست مثلا شاگردی از استاد خود در دانشی پیشی بگیرد حتی بدون اینکه به منبع متفاوتی از دانش و معرفتِ استادِ خودش متصل بشه چون ذهن انسان قادر به تولید دانش(knowledge) و بصیرت(insight) است و در مورد هوش مصنوعی این همواره مورد سوال بوده.

این مقاله برای چند وقت پیشه ولی از اهمیتش همین بگم که حتی در توئیتر مورد توجه Ian Goodfellow خالق GAN و ایلان ماسک هم قرار گرفت. تیم اصلی مقاله برای دانشگاه هاروارده. مقاله موضوع تعالی را حول مساله‌ی یادگیری مدل زبانی از بازی شطرنج می‌چیند.

تصور کنید که شما یک مدل زبانی را آموزش داده‌اید تا فقط با استفاده از خلاصه‌های بازی‌های شطرنج بازیکنانی که رتبه‌شان تا ۱۰۰۰ ایلو (Elo) است، شطرنج بازی کند(ایلو یک سیستم رتبه‌بندی است که برای اندازه‌گیری مهارت بازیکنان در بازی‌های رقابتی مثل شطرنج استفاده می‌شود). حالا، آیا ممکن است این مدل بتواند بهتر از ایلو ۱۰۰۰ بازی کند؟ یعنی آیا می‌تواند عملکرد داده‌های آموزشی خود را "پشت سر بگذارد"؟

این مقاله نشان می‌دهد که این امکان‌پذیر است که یک مدل بر اساس بازی‌های با رتبه ۱۰۰۰ ایلو آموزش ببنید و به مدلی دست یابد که می‌تواند در سطح ۱۵۰۰ ایلو بازی کند! این یعنی تعالی مدل بر آموزش‌ش. جایی که یک مدل تولیدی توانایی‌هایی را نشان می‌دهد که فراتر از توانایی‌های کارشناسانی است که داده‌های آن را تولید کرده‌اند.

نویسندگان این مقاله با استفاده از چهارچوب نظری دقیق و مشخص، این موضوع را به "تجمع یادگیرندگان ضعیف" (Ensembling Weak Learners) ربط می‌دهند. در این رویکرد، با میانگین‌گیری از خطاهای مستقل چندین مدل کوچک و ضعیف‌تر، یک نتیجه قوی‌تر حاصل می‌شود که می‌تواند اشتباهات فردی را "پاک‌سازی" کند (Denoising) و به نتایج دقیق‌تری برسد. این مفهوم یادگیری تجمعی ضعیف مطلب جدیدی نیست قبلا در بحث درخت‌های تصادفی Random Forestها کاربرد بحث Bootstrap Aggregation یا همون Bagging رو به عنوان یک یادگیری تجمعی ضعیف دیدید.

این مقاله تاکید دارد که برای رخ دادن این "تعالی"، نیاز به تنوع کافی داده‌ها و نمونه‌برداری دقیق دمایی (Temperature Sampling) است. "نمونه‌برداری دما" یک فرآیند است که در آن میزان تصادفی بودن تصمیمات مدل را تنظیم می‌کنیم؛ دمای پایین‌تر باعث می‌شود که مدل بر روی گزینه‌های با احتمال بیشتر، بیشتر تمرکز کند و کمتر به سمت گزینه‌های کم احتمال برود.
در راستای این تحقیقات، مدلی به نام ChessFormer توسعه یافته که توانسته است به چنین تعالی دست یابد. ChessFormer، که به طور خاص برای بازی شطرنج طراحی شده، تنها با داده‌هایی از بازیکنان با رتبه حداکثر ۱۰۰۰ ایلو آموزش دیده است. با این حال، قابلیت‌های این مدل به قدری پیشرفته بوده که توانسته است در سطوحی بالاتر از ۱۵۰۰ ایلو عملکرد نشان دهد، که این خود بیانگر دستیابی به سطحی از مهارت است که فراتر از تمام بازیکنان موجود در دیتاست آموزشی آن است.

این پیشرفت شگفت‌انگیز به خاطر بهره‌گیری از تکنیک‌های "نمونه‌برداری دما" با دمای پایین و تاکید بر تنوع داده‌ها ممکن شده است. نمونه‌برداری دما به ChessFormer اجازه می‌دهد تا تصمیمات دقیق‌تری بگیرد، به این معنی که مدل تمایل دارد تا از حرکات با احتمال بالای پیروزی استفاده کند و از حرکات کم‌بازده دوری کند. این استراتژی به‌ویژه در موقعیت‌های کلیدی بازی که تعیین‌کننده نتیجه هستند، تأثیر بسزایی دارد.
تأکید بر تنوع داده‌ها اقتضای اصلی تحقق تعالی است تا مدل با دیدن یک مجموعه گسترده‌ای از سناریوها و استراتژی‌ها، دانش لازم برای مواجهه با طیف وسیعی از شرایط مختلف را یاد بگیره و در عمل از "خرد جمعی" بازیکنان مختلف بهره‌مند بشه تا به نتایج بهتری نسبت به عملکرد هر بازیکن به تنهایی برسه.

اهمیت مدلی مثه ChessFormer اینه که درک ما از مرزهای دانش و توانایی‌های هوش مصنوعی را عوض می‌کند وقتی بدانیم پتانسیل فراتر رفتن از محدودیت‌های داده‌های آموزشی در هوش مصنوعی وجود داره هدف‌ گذاری‌هامون برای توسعه هوش مصنوعی شکل متفاوتی می‌گیره.
👍41
وقتی یک برنامه مینویسیم، برای داشتن دید جزئی‌تر از اجرای برنامه و منابع در حین اجرا میریم سراغ پروفایلینگ (Profiling)

درپایتون ابزار Memray یک memory profiler خوبه
https://github.com/bloomberg/memray
امکانات قابل توجهی داره

@DevTwitter | <MehrdadLinux/>
DevTwitter | توییت برنامه نویسی
وقتی یک برنامه مینویسیم، برای داشتن دید جزئی‌تر از اجرای برنامه و منابع در حین اجرا میریم سراغ پروفایلینگ (Profiling) درپایتون ابزار Memray یک memory profiler خوبه https://github.com/bloomberg/memray امکانات قابل توجهی داره @DevTwitter | <MehrdadLinux/>
به به چه ابزاری❤️!
کار دیتایی تو پایتون کرده باشین بسیار دیدین که نشت حافظه اتفاق می‌افته یا مثلا یک پایپلاین از فانکشن‌ها پشت سر هم روی یک داده فراخوانی میشه براتون مهمه بدونید که هر کدوم از فانکشن‌ها چقدر حافظه مصرف می‌کنند که اگه بعدا خواستید موازی‌سازی کنید بدونید چندتا instance از برنامه رو میتونید موازی اجرا کنید یا مثلا اگر برنامه‌تون مولتی‌ترد هست و یک دفعه کرش می‌کنه مانیتور کنید کدوم تابع منجر به کرش حافظه میشه.
شما برای همه‌ی این‌ها به یک memory profiler نیاز داشتید که یا بصورت یک پکیج پایتون بود یا اینکه خودتون با دیزاین پترن دکوریتور پیاده‌سازی‌ش می‌کردید.
مشکل اینجا بود که باید برای تک‌تک فانکشنهایی می‌خواستید در تمیزترین حالت دکوریتور ست می‌کردید.
گاهی لازم میشه یک مانیتورینگ سنگین روی یک محصول پروداکشن یا یک سرویس تست پیچیده راه بندازید که تاریخچه مصرف حافظه رو نگه‌ دارید اونجا مجبورید کد بزنید ولی واسه‌ کارهای دم دستی در این آپ لینوکسی که فقط هم روی لینوکس و مک جواب میده شبیه htop که مصرف حافظه و پردازنده رو به ازای هر پراسس بصورت لحظه‌ای نشون میده این ابزار مصرف حافظه رو به ازای هر فانکشن نشون میده.
👍5
Dev Tweet
به به چه ابزاری❤️! کار دیتایی تو پایتون کرده باشین بسیار دیدین که نشت حافظه اتفاق می‌افته یا مثلا یک پایپلاین از فانکشن‌ها پشت سر هم روی یک داده فراخوانی میشه براتون مهمه بدونید که هر کدوم از فانکشن‌ها چقدر حافظه مصرف می‌کنند که اگه بعدا خواستید موازی‌سازی…
ولی همچنان یک چالش رو جواب نمیده!
مموری پروفایل واسه دونستن مصرف لحظه‌ای حافظه خیلی ارزشی نداره! معمولا ارزشش به اینه که بدونید یک تابع در طول اجرائش حداکثر حافظه‌ای که استفاده می‌کنه چقدره. واسه اینکار من هنوز یک راه‌حل آماده پیدا نکردم. حتی با کد از داخل برنامه‌ هم نمی‌تونید این پروفایلینگ رو انجام بدید چون مثلا فرض کنید یک داده خاصی مثه nii.gz یک گیگی رو میخواید لود کنید یک خط از کد شما این داده رو لود می‌کنه ولی خود این لودر حین اجرائش مصرفش از صفر بایت حافظه شروع می‌شه به مصرف یک گیگ می‌رسه(اگر فرض کنیم داده nii.gz در دیسک و مموری یک حجم برابر اشغال میکنه یعنی وقتی تو حافظه لود میشه جای بیشتری نمیگیره) اما ممکنه حین لودش مثلا یک گیگ و بیست مگ حافظه استفاده کنه بعد از پایان لود به حافظه یک گیگ برسه یعنی میخوام بگم در خیلی از موارد اصلا اینطوری نیست مصرف حافظه قبل و بعد از اجرای یک تابع رو حساب کنید بعد از هم کم کنید حداکثر مصرف رو به دست می‌میارید، نه اصلا اینطور نیست! ممکنه حین اجرائش پردازشی انجام بده که نیاز به حافظه زیاد داره ولی در اخر استیتی رو return میکنه که کم حافظه‌تره. در این موارد دیگه اون پترن دیکوریتور جواب نمیده! حتی لاگ کردن تاریخچه مصرف حافظه، ترسیم تاریخچه‌ها جوابگو نیست چون ریزدانگی کافی رو نداره چون لحظه‌ای نیست خط به خطه.
این اپ لینوکسی که معرفی کردم چون داره از بیرون برنامه حافظه رو مانیتور و پروفایل می‌کنه میتونه تغییرات مصرف حافظه نه تنها قبل و بعد از اجرا هر فانکشن بلکه حین اجرای اون رو هم پروفایل کنه ولی هنوز کار ساز نیست! چون ثبت نمیشه که بتونیم حداکثر مصرف اون تابع رو بدونیم حالا باید بگردیم ببینم این اپ کامندلاین بهمون api واسه ثبت لحظه‌ای حافظه در فایل میده که ازش حداکثر حافظه رو بیرون بکشیم اگه بده مشکل حله! چون میتونه مستقیم به خود اپ bind بشه و فقط اپ پایتونی رو پروفایل کنه.
👍4
از اهمیت مدل جدید 405 میلیارد پارامتری جدید شرکت متا یعنی Llama3.1 همین بس که داره کپ فاصله‌ی بین مدل‌های متن-بسته(closed-source) و وزن-باز(مدلهایی که وزن‌شان را به همراه کد منتشر می‌کنند) رو از بین می‌بره.
همین این اتفاقات تقریبا در یک سال افتاده از آپریل 2023 که جولای 2024
باید منتظر باشیم ببنیم آیا به نقطه‌ای می‌رسید که خط قرمز و سبز به هم بخورن و خط قرمز از خط سبز عبور کنه!؟ صد البته که خیلی بعیده مخصوصا با این زیرساخت افسانه‌ای که شرکت xAI ایلان ماسک برای مدل جدیدش راه انداخته!
👍2
Dev Tweet
آینده‌ی هوش مصنوعی در این رشته توئیت مقایسه جالبی بین روند توسعه سرعت هواپیما و نرخ کلاک cpu با روند توسعه ai انجام داده که نکات خیلی جالبی‌داره. من چند تا نکته‌ش رو در ادامه میارم: ۱. مقایسه پیشرفت‌های سریع در سرعت هواپیماها در دهه ۱۹۶۰ با پیشرفت فعلی در…
این نمودار حاوی چند نکته است:
1. نکته‌ای در این پست سابق در موردش مفصل صحبت کردم.
در شش ماه اخیر شامل هیچ جهشی در بهترین عملکرد هوش مصنوعی نیستیم(دقت کنید جهش در دقت و کارائي محصول یک شرکت خاص را نمی‌گم منظورم جهش در کارائي و دقت بهترین مدل موجوده). یعنی احتمالا به نقطه‌ای رسیدیم که آن بهبود‌های جهشی بعد از آپریل 2023 که تازه gpt-4 عرضه شده بود را دیگر نخواهیم داشت. پیشرفت کارائي مدل‌ها بصورت خزنده و جزئي خواهد بود.

2. رقابت در بهترین مدل بین شرکت‌های بزرگ بالا گرفته و هر یکی دو ماه جایگاه بهترین مدل بین سه تا شرکت اصلی آنتروپیک و گوگل و OpenAI عوض شده است. به این معنی که دیگر دوره پیشتازی طولانی مدت OpenAI سر اومده و بازیگرهای متنوع‌تری در بازار LLM دارند قدرت‌نمایی می‌کنند.

تازه هنوز Grok خیلی وارد بنچ‌مارک‌ها و عرضه‌ رایگان عمومی نشده!
👍21
Dev Tweet
از اهمیت مدل جدید 405 میلیارد پارامتری جدید شرکت متا یعنی Llama3.1 همین بس که داره کپ فاصله‌ی بین مدل‌های متن-بسته(closed-source) و وزن-باز(مدلهایی که وزن‌شان را به همراه کد منتشر می‌کنند) رو از بین می‌بره. همین این اتفاقات تقریبا در یک سال افتاده از آپریل…
نکته‌ای در مورد open-weight
موقعی که در مورد کد صحبت می‌کنیم یا کد منبع بسته closed-source است یا منبع باز opensource یعنی یا سورس کد روی گیت‌هاب یا بیت‌باکت هست.
اما وقتی در مورد یک مدل AI صحبت می‌کنیم دو ضلع دیگه هم به جز سورس کد به قضیه اضافه میشه: وزن مدل‌ آموزش دیده و داده آموزش مدل.
شرکت‌ها غیرانتفاعی مثه گوگل معمولا از مدل‌هاشون مقاله چاپ می‌کنند و حرفی از پیاده‌سازی نمی‌زنند.
نهایتا سورس کد مدلهای proprietary شون رو منتشر می‌کنند ولی دیگه وزن رو کمتر منتشر می‌کنند.
و خیلی کمتر مثه mistral و meta میان مقاله + سورس کد + وزن مدل را هم منتشر می‌کنند.
و خیلی خیلی کمتر مدل‌ها دادگان آموزش خودشون رو همراه سه تای قبلی منتشر می‌کنند اینا معمولا مد‌ل‌های دانشگاهی هستند.
پس به خاطر داشته باشید سطح انتشار اطلاعات در مورد مدل‌ها سه سطحه: مقاله، سورس‌کد، وزن‌های مدل‌، داده آموزش .
👍6
شرط‌بندی در مورد آیند‌ه‌ی توسعه AI
(الایزر یودکوفسکی در مقابل پاول کریستیانو)

الایزر یودکوفسکی(Eliezer Yudkowsky) و پاول کریستیانو(Paul Christiano)، دو تا از چهره‌های سرشناس حوزه ایمنی هوش مصنوعی(AI Safety)، سال 2021 سر آینده AI شرط بستن!
می‌تونید ماجراش رو در این دو لینک بخونید. (لینک ۱ و لینک ۲)
یودکوفسکی که از بنیانگذاران موسسه تحقیقات هوش ماشینی (Machine Intelligence Research Institute) هست، مدت‌هاست درباره احتمال وقوع یه سناریوی برخاستن سریع هشدار میده.
از طرف دیگه، کریستیانو که تو زمینه ترازمندی(هم‌راستاسازی) هوش مصنوعی (AI alignment) کار می‌کنه و همچنین مخترع RLHF (تقویت یادگیری از بازخورد انسانی) که بیشتر به یه مسیر توسعه تدریجی‌تر معتقده.

موضوع اصلی شرط‌بندیشون اینه که سرعت پیشرفت قابلیت‌های هوش مصنوعی چقدر سریع خواهد بود. این بحث معمولاً با عنوان "سرعت‌های برخاستن" (takeoff speeds) مطرح میشه - برخاستن آهسته(Slow Takeoff) در مقابل برخاستن سریع(Hard/Fast Takeoff).
تصور کنید پیشرفت هوش مصنوعی مثل یه سفر به قله کوهه. برخاستن آهسته شبیه یه کوهنوردی تدریجیه، با بهبودهای پیوسته که به جامعه اجازه میده در طول مسیر خودش رو تطبیق بده. اما برخاستن سریع مثل یه پرتاب موشکیه - یه افزایش ناگهانی و احتمالاً نمایی در توانایی‌های هوش مصنوعی که می‌تونه همه رو غافلگیر کنه.
برای اینکه پیش‌بینی‌هاشون رو محک بزنن، رو یه چالش مشخص تمرکز کردن: المپیاد جهانی ریاضی (IMO). سوال اینه که آیا تا سال ۲۰۲۵، یه سیستم هوش مصنوعی می‌تونه در بالاترین سطوح این مسابقه معتبر ریاضی رقابت کنه؟

کریستیانو شرط بسته که پیشرفت سریع اتفاق نمی‌افته. اون پیش‌بینی کرده که شانس اینکه یه هوش مصنوعی بین سال‌های ۲۰۲۲ تا ۲۰۲۵ مدال طلای IMO رو ببره، کمتر از ۸ درصده. حتی درباره حل سخت‌ترین مسئله توسط AI هم بدبین‌تره و این احتمال رو زیر ۴ درصد می‌دونه.
یودکوفسکی اما طبق معمول به پتانسیل هوش مصنوعی خوش‌بین‌تره. اون شرط بسته که حداقل ۱۶ درصد احتمال داره که یه AI تا سال ۲۰۲۵ قابلیت فنی کسب مدال طلا رو داشته باشه.
این پیش‌بینی‌ها برای سال 2021 است.
چیزی که این شرط‌بندی رو جذاب می‌کنه، پیامدهای احتمالیشه. اگه واقعاً یه هوش مصنوعی اون مدال طلا رو بگیره، این فقط یه برد ساده برای یودکوفسکی تو این شرط دوستانه نیست. می‌تونه نشونه‌ای از سرعت بالاتر توسعه هوش مصنوعی نسبت به انتظارات خیلی‌ها باشه. کریستیانو گفته که همچین نتیجه‌ای می‌تونه دیدگاهش رو به طور قابل توجهی تغییر بده و احتمالاً تخمینش از احتمال یه سناریوی برداشت سریع رو تا دو برابر افزایش بده.
کریستیانو قبلاً گفته بود اگه تا سال ۲۰۲۵ شاهد کسب مدال طلای IMO توسط یه AI باشه، احتمال برخاستن سریع رو از ۳۰٪ به ۵۰٪ افزایش میده.

سال 2024 گوگل دیپ‌مایند (Google DeepMind) هم فقط یک سؤال با این دستاورد فاصله داشت.

و حالا، به نظر میرسه که این اتفاق خیلی زودتر از انتظار رخ داده! سام (Sam) آلتمن، مدیرعامل اوپن‌ای (OpenAI)، به تازگی به طور تلویحی اشاره کرده که سیستم هوش مصنوعی اونها به سطح مدال طلای المپیاد جهانی ریاضی رسیده.
این پیشرفت سریع می‌تونه نشون‌دهنده احتمال بیشتر یه "برخاستن سریع" باشه - یعنی پیشرفت هوش مصنوعی عمومی (AGI) در عرض چند دقیقه تا چند ماه، به جای سال‌ها یا دهه‌ها.
برخاستن‌های سریع نگران‌کننده هستن چون پیش‌بینی‌شون خیلی سخت‌تره. نهادهای انسانی تقریباً هیچ زمانی برای تطبیق با نرخ‌های دیوانه‌وار تغییر ندارن.
حدود ۳۰٪ از محققان ایمنی هوش مصنوعی فکر می‌کنن که برخاستن سریع محتمل‌تر از برخاستن آهسته‌ست.
البته باید توجه داشت که ممکنه سام آلتمن در حال شوخی کردن باشه، اما اگه این خبر واقعیت داشته باشه، می‌تونه نقطه عطف مهمی در توسعه هوش مصنوعی باشه.

تصویر ضمیمه شده نشون میده که سیستم هوش مصنوعی اوپن‌ای با ۳۱ امتیاز، بالاتر از مدال نقره (۲۸ امتیاز) و در سطح مدال طلای IMO ۲۰۲۴ قرار گرفته.
1
CREATE OR REPLACE FUNCTION normalize_arabic_persian_text(input_text TEXT)
RETURNS TEXT AS $$
DECLARE
result TEXT := '';
i INT;
current_char TEXT;
prev_char TEXT := '';
next_char TEXT := '';
in_word BOOLEAN := FALSE;
BEGIN
-- First, convert to isolated forms and map to Persian equivalents
FOR i IN 1..length(input_text) LOOP
current_char := substring(input_text FROM i FOR 1);
IF i < length(input_text) THEN
next_char := substring(input_text FROM i+1 FOR 1);
ELSE
next_char := '';
END IF;

-- Alef and hamza
IF current_char = ANY(ARRAY[E'\uFE81'::TEXT, E'\uFE83'::TEXT, E'\uFE85'::TEXT, E'\uFE87'::TEXT, E'\uFE89'::TEXT, E'\uFE8D'::TEXT, E'\u0622'::TEXT, E'\u0623'::TEXT, E'\u0625'::TEXT, E'\u0627'::TEXT, E'\u0671'::TEXT]) THEN
current_char := E'\u0627'; -- All forms of alef to ا
-- Beh
ELSIF current_char = ANY(ARRAY[E'\uFE8F'::TEXT, E'\uFE91'::TEXT, E'\uFE93'::TEXT, E'\u0628'::TEXT]) THEN
current_char := E'\u0628'; -- ب
-- Teh
ELSIF current_char = ANY(ARRAY[E'\uFE95'::TEXT, E'\uFE97'::TEXT, E'\uFE99'::TEXT, E'\u062A'::TEXT]) THEN
current_char := E'\u062A'; -- ت
-- Theh
ELSIF current_char = ANY(ARRAY[E'\uFE99'::TEXT, E'\uFE9B'::TEXT, E'\uFE9D'::TEXT, E'\u062B'::TEXT]) THEN
current_char := E'\u062B'; -- ث
-- Jeem
ELSIF current_char = ANY(ARRAY[E'\uFE9D'::TEXT, E'\uFE9F'::TEXT, E'\uFEA1'::TEXT, E'\u062C'::TEXT]) THEN
current_char := E'\u062C'; -- ج
-- Hah
ELSIF current_char = ANY(ARRAY[E'\uFEA1'::TEXT, E'\uFEA3'::TEXT, E'\uFEA5'::TEXT, E'\u062D'::TEXT]) THEN
current_char := E'\u062D'; -- ح
-- Khah
ELSIF current_char = ANY(ARRAY[E'\uFEA5'::TEXT, E'\uFEA7'::TEXT, E'\uFEA9'::TEXT, E'\u062E'::TEXT]) THEN
current_char := E'\u062E'; -- خ
-- Dal
ELSIF current_char = ANY(ARRAY[E'\uFEA9'::TEXT, E'\uFEAB'::TEXT, E'\u062F'::TEXT]) THEN
current_char := E'\u062F'; -- د
-- Thal
ELSIF current_char = ANY(ARRAY[E'\uFEAB'::TEXT, E'\uFEAD'::TEXT, E'\u0630'::TEXT]) THEN
current_char := E'\u0630'; -- ذ
-- Reh
ELSIF current_char = ANY(ARRAY[E'\uFEAD'::TEXT, E'\uFEAF'::TEXT, E'\u0631'::TEXT]) THEN
current_char := E'\u0631'; -- ر
-- Zain
ELSIF current_char = ANY(ARRAY[E'\uFEAF'::TEXT, E'\uFEB1'::TEXT, E'\u0632'::TEXT]) THEN
current_char := E'\u0632'; -- ز
-- Seen
ELSIF current_char = ANY(ARRAY[E'\uFEB1'::TEXT, E'\uFEB3'::TEXT, E'\uFEB5'::TEXT, E'\u0633'::TEXT]) THEN
current_char := E'\u0633'; -- س
-- Sheen
ELSIF current_char = ANY(ARRAY[E'\uFEB5'::TEXT, E'\uFEB7'::TEXT, E'\uFEB9'::TEXT, E'\u0634'::TEXT]) THEN
current_char := E'\u0634'; -- ش
-- Sad
ELSIF current_char = ANY(ARRAY[E'\uFEB9'::TEXT, E'\uFEBB'::TEXT, E'\uFEBD'::TEXT, E'\u0635'::TEXT]) THEN
current_char := E'\u0635'; -- ص
-- Dad
ELSIF current_char = ANY(ARRAY[E'\uFEBD'::TEXT, E'\uFEBF'::TEXT, E'\uFEC1'::TEXT, E'\u0636'::TEXT]) THEN
current_char := E'\u0636'; -- ض
-- Tah
ELSIF current_char = ANY(ARRAY[E'\uFEC1'::TEXT, E'\uFEC3'::TEXT, E'\uFEC5'::TEXT, E'\u0637'::TEXT]) THEN
current_char := E'\u0637'; -- ط
-- Zah
ELSIF current_char = ANY(ARRAY[E'\uFEC5'::TEXT, E'\uFEC7'::TEXT, E'\uFEC9'::TEXT, E'\u0638'::TEXT]) THEN
current_char := E'\u0638'; -- ظ
-- Ain
ELSIF current_char = ANY(ARRAY[E'\uFEC9'::TEXT, E'\uFECB'::TEXT, E'\uFECD'::TEXT, E'\u0639'::TEXT]) THEN
current_char := E'\u0639'; -- ع
-- Ghain
ELSIF current_char = ANY(ARRAY[E'\uFECD'::TEXT, E'\uFECF'::TEXT, E'\uFED1'::TEXT, E'\u063A'::TEXT]) THEN
current_char := E'\u063A'; -- غ
-- Feh
ELSIF current_char = ANY(ARRAY[E'\uFED1'::TEXT, E'\uFED3'::TEXT, E'\uFED5'::TEXT, E'\u0641'::TEXT]) THEN
current_char := E'\u0641';  -- ف
-- Qaf
ELSIF current_char = ANY(ARRAY[E'\uFED5'::TEXT, E'\uFED7'::TEXT, E'\uFED9'::TEXT, E'\u0642'::TEXT]) THEN
current_char := E'\u0642'; -- ق
-- Kaf
ELSIF current_char = ANY(ARRAY[E'\uFED9'::TEXT, E'\uFEDB'::TEXT, E'\uFEDD'::TEXT, E'\u0643'::TEXT]) THEN
current_char := E'\u06A9'; -- ک (Persian kaf)
-- Lam
ELSIF current_char = ANY(ARRAY[E'\uFEDD'::TEXT, E'\uFEDF'::TEXT, E'\uFEE1'::TEXT, E'\u0644'::TEXT]) THEN
current_char := E'\u0644'; -- ل
-- Meem
ELSIF current_char = ANY(ARRAY[E'\uFEE1'::TEXT, E'\uFEE3'::TEXT, E'\uFEE5'::TEXT, E'\u0645'::TEXT]) THEN
current_char := E'\u0645'; -- م
-- Noon
ELSIF current_char = ANY(ARRAY[E'\uFEE5'::TEXT, E'\uFEE7'::TEXT, E'\uFEE9'::TEXT, E'\u0646'::TEXT]) THEN
current_char := E'\u0646'; -- ن
-- Heh
ELSIF current_char = ANY(ARRAY[E'\uFEE9'::TEXT, E'\uFEEB'::TEXT, E'\uFEED'::TEXT, E'\u0647'::TEXT, E'\u06C0'::TEXT]) THEN
current_char := E'\u0647'; -- ه
-- Waw
ELSIF current_char = ANY(ARRAY[E'\uFEED'::TEXT, E'\uFEEF'::TEXT, E'\u0648'::TEXT]) THEN
current_char := E'\u0648'; -- و
-- Yeh
ELSIF current_char = ANY(ARRAY[E'\uFEF1'::TEXT, E'\uFEF3'::TEXT, E'\uFEF4'::TEXT, E'\u0649'::TEXT, E'\u064A'::TEXT, E'\uFEF5'::TEXT]) THEN
current_char := E'\u06CC'; -- ی (Persian yeh)
-- Persian specific letters
ELSIF current_char = ANY(ARRAY[E'\uFB56'::TEXT, E'\uFB57'::TEXT, E'\uFB58'::TEXT, E'\uFB59'::TEXT, E'\u067E'::TEXT]) THEN
current_char := E'\u067E'; -- پ (peh)
ELSIF current_char = ANY(ARRAY[E'\uFB7A'::TEXT, E'\uFB7B'::TEXT, E'\uFB7C'::TEXT, E'\uFB7D'::TEXT, E'\u0686'::TEXT]) THEN
current_char := E'\u0686'; -- چ (cheh)
ELSIF current_char = ANY(ARRAY[E'\uFB8A'::TEXT, E'\uFB8B'::TEXT, E'\u0698'::TEXT]) THEN
current_char := E'\u0698'; -- ژ (jeh)
ELSIF current_char = ANY(ARRAY[E'\uFB92'::TEXT, E'\uFB93'::TEXT, E'\uFB94'::TEXT, E'\uFB95'::TEXT, E'\u06AF'::TEXT]) THEN
current_char := E'\u06AF'; -- گ (gaf)
-- Additional Arabic letters not commonly used in Persian
ELSIF current_char = ANY(ARRAY[E'\u0629'::TEXT, E'\uFE93'::TEXT, E'\uFE94'::TEXT]) THEN
current_char := E'\u0647'; -- ة (teh marbuta) to ه (heh)
ELSIF current_char = ANY(ARRAY[E'\u0624'::TEXT, E'\uFE85'::TEXT, E'\uFE86'::TEXT]) THEN
current_char := E'\u0648'; -- ؤ (waw with hamza) to و (waw)
ELSIF current_char = ANY(ARRAY[E'\u0626'::TEXT, E'\uFE89'::TEXT, E'\uFE8A'::TEXT, E'\uFE8B'::TEXT, E'\uFE8C'::TEXT]) THEN
current_char := E'\u06CC'; -- ئ (yeh with hamza) to ی (Persian yeh)
-- Additional special cases
ELSIF current_char = E'\u0640'::TEXT THEN
current_char := ''; -- Remove tatweel (kashida)
ELSIF current_char = E'\uFEFB'::TEXT OR current_char = E'\uFEFC'::TEXT THEN
current_char := E'\u0644\u0627'; -- لا (lam-alef ligature) to separate ل and ا
ELSIF current_char = E'\uFEF5'::TEXT OR current_char = E'\uFEF6'::TEXT THEN
current_char := E'\u0644\u0622'; -- لآ (lam-alef madda ligature) to separate ل and آ
ELSIF current_char = E'\uFEF7'::TEXT OR current_char = E'\uFEF8'::TEXT THEN
current_char := E'\u0644\u0623'; -- لأ (lam-alef hamza above ligature) to separate ل and أ
ELSIF current_char = E'\uFEF9'::TEXT OR current_char = E'\uFEFA'::TEXT THEN
current_char := E'\u0644\u0625'; -- لإ (lam-alef hamza below ligature) to separate ل and إ
ELSIF current_char = E'\u0621'::TEXT THEN
current_char := ''; -- Remove standalone hamza
-- Special case for لا
ELSIF current_char = E'\u0644'::TEXT AND next_char = E'\u0627'::TEXT THEN
current_char := E'\u0644\u0627'; -- لا
i := i + 1; -- Skip next character
-- Special case for لآ
👍1

ELSIF current_char = E'\u0644'::TEXT AND next_char = E'\u0622'::TEXT THEN
current_char := E'\u0644\u0622'; -- لآ
i := i + 1; -- Skip next character
END IF;

-- Append the character to the result, preserving word boundaries
IF current_char != '' THEN
IF NOT in_word THEN
-- Add a space only if it's not the first character
IF result != '' THEN
result := result || ' ';
END IF;
in_word := TRUE;
END IF;
result := result || current_char;
END IF;

prev_char := current_char;
END LOOP;

-- Remove diacritical marks
result := translate(result,
E'\u064B\u064C\u064D\u064E\u064F\u0650\u0651\u0652\u0670\u0655\u0656\u0653\u0654\u0610\u0611\u0612\u0613\u0614\u0615\u0616\u0617\u0618\u0619\u061A\u06D6\u06D7\u06D8\u06D9\u06DA\u06DB\u06DC\u06DD\u06DE\u06DF\u06E0\u06E1\u06E2\u06E3\u06E4\u06E5\u06E6\u06E7\u06E8\u06E9\u06EA\u06EB\u06EC\u06ED',
repeat('', 48)
);
-- The above line removes the following diacritical marks:
-- \u064B (Fathatan), \u064C (Dammatan), \u064D (Kasratan), \u064E (Fatha), \u064F (Damma), \u0650 (Kasra),
-- \u0651 (Shadda), \u0652 (Sukun), \u0670 (Supernoscript Alef), \u0655 (Hamza Below), \u0656 (Subnoscript Alef),
-- \u0653 (Maddah Above), \u0654 (Hamza Above), \u0610-\u061A (Arabic signs),
-- \u06D6-\u06ED (Arabic small high ligatures and other marks)

-- Remove multiple spaces
result := regexp_replace(result, '\s+', ' ', 'g');
-- This removes any sequence of one or more whitespace characters (\s+)
-- and replaces it with a single space

-- Trim leading and trailing spaces
result := trim(both from result);
-- 'both' removes spaces from both the beginning and end of the string
-- This includes spaces, tabs, newlines, and other whitespace characters

RETURN result;
END;
$$ LANGUAGE plpgsql;
سه تا پیام بالا رو ببینید!
یک تابع sql است!
این تابع یکی از کاملترین normalizerها یا sanitizer‌های متن فارسیه!
اگر با دیتابیس اپلیکیشن فارسی کرده باشید حتما دیدید که کاربرای فارسی زبان با کیبوردهای مختلف اطلاعاتشون رو وارد میکنند.
اشکالی که پیش میاد شما کلماتی دارید(مثلا نام و نام خانوادگی) که ظاهر برابر دارند ولی چون unicode کاراکتراشون با هم برابر نیست اون دو تا کلمه مساوی نیستند.
کارکردهایی نرمالیزیشن این فاکشن خیلی بیشتر از تبدیل کاراکتره.
لذا خوبه این رو یه جایی ذخیره داشته باشید احتمال زیاد به کارتون میاد.

این کوئری خیلی طولانی که نوشتنش واقعا دو سه روزی طول می‌کشه به لطف Sonnet3.5-200K تولید شده.
👍3
SELECT normalize_arabic_persian_text(E'نَصّ حَكيمٌ لَهُ سِرٌّ قَاطِعٌ وَذُو شَأنٍ عَظِيمٍ مَكتُوبٌ عَلَى ثَوْبٍ أخْضَرَ وَمُغَلَّفٌ بِجِلْدٍ أزْرَق');

خروجی این تابع sql
نص حکیم له سر قاطع وذو شان عظیم مکتوب علی ثوب اخضر ومغلف بجلد ازرق
برای اینکه بفهمید توی این کوئری چه اتفاقی می‌افته این صفحه ویکی پدیا رو بببنید.
https://en.wikipedia.org/wiki/Arabic_noscript_in_Unicode

در این کوئری نشون میده که یک کاراکتر متحدالشکل چطور میتونه unicodeهای مختلف داشته باشه.
دقت کنید وقتی که دارید از مثلا حرف ب در وسط یک کلمه مثل «شبرنگ» استفاده می‌کند از کاراکتر با یونیکد FE92 ‌استفاده نمی‌شه بلکه کیبوردهای خاصی میتونن اون کاراکتر رو تایپ کنند و معمول کیبوردهای ما همه‌ی کاراکترها رو در general form یا isolated form تولید می‌کنند.
😂😭
قضاوت با شما:)
😁3😢1
هاگینگ فیس برای ورژینینگ داده‌های عظیمی که هاست می‌کنه از Git LFS استفاده می‌کنه
الان می‌خواد یک جایگزین دیگه به اسم xetdata رو بخره برای نگهداری داده‌هاش
نکته جالبش اینه که اومده آمار یک روز زیرساختش رو اعلام کرده
در تصویر دورش خط کشیدم واقعا عجیبه.
نگهداری یه سرویس در این اسکیل کاملا کار لبه‌ی دانشه!
👍2👎1
مدل‌های زبانی فقط توکن بعد رو پیش‌بینی نمی‌کنن!

این مقاله اومده یک ایده‌ی اساسی در مورد LLMها رو رد کرده اون ایده اینه که LLMها فقط بلد هستند next token prediction انجام بدهند. یک بحث غیر فنی ولی استدلالی میکنه که اینطور نیست که مدل‌های زبانی بزرگ (LLM) فقط بلد باشند کلمه بعدی رو حدس بزنن. نویسنده‌ به این تفکر ساده‌انگارانه میگه "جاستائیسم" (Justaism)(من ترجمه می‌کنم به فقط‌انگاری). میگه درسته که LLMها یه هدف ساده دارن اونم پیش‌بینی توکن بعدیه ولی این به این معنی نیست که چیز دیگری یاد نگیرن. بعد یه مثال جالب می‌زنه. میگه آدما به لحاظ تکامل فقط دو تا objective داشتن دنبال زنده موندن survival و تولید مثل reproduction بودند، ولی یادگرفتن در راه تحصیل این دو تا هدف فکرای پیچیده بکنن و به قابلیت‌های بیشتر از تولید مثل و زنده‌ماندن برسند، به طور مشابه LLMها هم همینطورن! در یادگیری اینها یه فرآیند اتفاق می‌افته به اسم "بهینه‌سازی تپه‌تخت" (mesa-optimization).

اصطلاح Mesa-optimization رو اینجوری توضیح میدن: فرض کنید در یک بازی کامپیوتری داری بازیکن برای برنده شدن فقط باید بیشترین امتیاز رو بیاره به این در ادبیات بهینه‌سازی تپه‌تخت میگن(base objective هدف ساده پایه‌ای). ولی برای بازیکن برنده برای بردش یه عالمه ترفند و تاکتیک یاد گرفته که کسی بهش یاد نداده. به این میگن (mesa objective هدف تخت تپه)
اصطلاح Justaism هم اصطلاح جالب دیگه این مقاله است یک عبارت انتقادی شبیه whataboutism به رویکردی میگه که می‌خواهد مدل‌های زبانی بزرگ رو ساده‌ انگاری که و بگه ("it's just...") یعنی مثلا بگه "it's just a next-token predictor" اینکه فقط یک پیش‌بینی‌گر توکن بعدیه! هوشمندی درش معنی نداره.
خلاصه که این مقاله میگه نباید هوش مصنوعی رو دست کم گرفت!

توضیح شهودی‌تر Mesa-optimization رو در تصویر بعدی ببنید.

فایل مقاله را در کامنت‌ها قرار دادم یه کم بد پیدا میشه.
👍4
Dev Tweet
مدل‌های زبانی فقط توکن بعد رو پیش‌بینی نمی‌کنن! این مقاله اومده یک ایده‌ی اساسی در مورد LLMها رو رد کرده اون ایده اینه که LLMها فقط بلد هستند next token prediction انجام بدهند. یک بحث غیر فنی ولی استدلالی میکنه که اینطور نیست که مدل‌های زبانی بزرگ (LLM) فقط…
این عکس خیلی خوب بهینه‌سازی تپه‌تخت mesa-optimization رو نشون میده!
مسا یا همون تپه‌تخت یک قله مسطح داره و یک شبیه نزدیک به 90 درجه.
یک همانند سازی قشنگ در اصطلاح این بهینه‌سازی وجود داره میگه ممکنه base objective یا همون هدف پایه رسیدن به یک سطح صاف باشه که در LLMها میشه همون next-token prediction اما برای رسیدن به اون هدف پایه باید بتون از شیب نزدیک به 90 درجه عبور کنی که میشه همون mesa-objective یعنی هدف ثانویه‌ی غیر صریح.
هر آدمی که راه رفتن بلده می‌تونه روی سطح تپه قدم بزنه ولی فقط آدمی که صخره ‌نوری بلده می‌تونه به اون سطح تپه برسه!
👌4👍1
تیشرت برازنده‌ی فضلا و اهل علم😁😍
😁10👍1