هوش مصنوعی توهم هوشمندی یا درک واقعی مطلب ؟

سوال مهم اینکه آیا هوش مصنوعی واقعا هوشمند است ؟ این سوال از آنجا دوباره برای من جذاب شد که دیروز خبری مبنی بر خودکشی خانمی ۲۹ ساله را خواندم که بعد از صحبت با Chatgpt قانع شده بود خود را برای یک هدف الهی باید قربانی کند.

·۵ دقیقه برای خواندن
هوش مصنوعی توهم هوشمندی یا درک واقعی مطلب ؟

داستان چیست؟

کمی بعد از ساعت ۵ صبح روز دوشنبه ۲۹ ژوئن ۲۰۲۵ کریستین فیت مدیسون مادر ۲۹ ساله در بزرگراه بین ایالتی ۲۲ در جفرسون به زندگی خود پایان داد. علت مرگ برخورد با یکی از خودروهای عبوری اعلام شد. داستان به اینجا ختم نمیشود وکلای خانواده مدیسون به تازگی شکایتی را علیه شرکت OpenAI مطرح کرده‌اند که در آن چت بات این شرکت یعنی ChatGPT را متهم میکند که کریستین را متقاعد کرده تا چنین کاری را برای تحقق یک پیشگویی الهی انجام دهد. البته وکلای این خانواده اذعان دارند که وی دچار بیماری روانی حاد بوده است اما مدعی میشوند که ChatGPT به جای کمک‌های روان شناختی به باورهای هذیانی او دامن زده است.

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

توهم دانایی

خواننده محترم قطعا این مطلب را تا اینجا تیتر زردی برای دیده شدن میبیند چرا که معتقد است ChatGPT هر سوالی را که پرسیده میشود با دقت و سرعت بالا پاسخ میدهد پس واقعا یک تکنولوژی هوشمند است. اما ما در کدپدیا آن را توهم هوشمندی می نامیم. برای درک بهتر این قضیه بیایید نگاهی به کد یک GPT بیاندازیم.

توجه :‌ کد کامل در اینجا آورده نشده است تنها بخش‌هایی از کد که برای توضیح مسئله مد نظر ما کافی هستند بیان میشود

def causal_attention_mask(batch_size, n_dest, n_src, dtype):
    i = ops.arange(n_dest)[:, None]
    j = ops.arange(n_src)
    m = i >= j - n_src + n_dest
    mask = ops.cast(m, dtype)
    mask = ops.reshape(mask, [1, n_dest, n_src])
    mult = ops.concatenate(
        [ops.expand_dims(batch_size, -1), ops.convert_to_tensor([1, 1])], 0
    )
    return ops.tile(mask, mult)

هدف این کد ایجاد اصل علیت در یک سازنده متن است به شکلی که هر توکن بتواند فقط به توکن‌های گذشته خود نگاه کند نه توکن‌های آینده. برای ملموس‌تر شدن قضیه بیاید یک مثال متنی را با این کد بررسی کنیم. فرض کنید من این عبارت را دارم ["The", "cat", "sits", "on", "mat"] ( گربه روی پادری نشسته است ) و هدف ترجمه ماشینی آن است. برای این کار میخواهم از تابع بالا استفاده کنم. اول ببینم تابع چه چیزهایی را قبول میکند:

  • تعداد دسته یا batch_size که برای راحتی کار ما آن را ۱ فرض میکنیم.
  • طول جمله مبدا یا n_src که در اینجا ۵ کلمه است.
  • طول جمله مقصد n_dest که در اینجا ۳ کلمه است.

هدف تابع ایجاد این ماتریس ۵×۳ است.

سطر (کلمه‌ی تولیدشده در مقصد) ↓"The" (j=0)"cat" (j=1)"sits" (j=2)"on" (j=3)"mat" (j=4)
"گربه" (i=0)۱ ✅۱ ✅۱ ✅۰ ❌۰ ❌
"نشسته" (i=1)۱ ✅۱ ✅۱ ✅۱ ✅۰ ❌
"روی" (i=2)۱ ✅۱ ✅۱ ✅۱ ✅۱ ✅

بیایید با هم تفسیر متنی هر سطر را بررسی کنیم.

  1. سطر اول مدل تازه شروع کرده اجازه دارد تنها به ۳ کلمه اول در جمله مبدا نگاه کند که شامل "The" ، "cat" و "sits" است. پس تا اینجا کلمه گربه قابل ترجمه است.
  2. ترجمه کلمه دوم نشسته اینجا مدل آگاه شده که گربه‌ای نشسته است طبق مدل‌های آموزش داده شده این گربه باید روی چیزی نشسته باشد پس با توجه به دیده شدن چهار کلمه اول مشخصا کلمه "on" در ادامه خواهد آمد
  3. در نهایت زمانی که کلمه سوم ساخته میشود حد n_dest رعایت شده و مدل به تمام ۵ کلمه جمله مبدا دسترسی دارد و اینجا میتواند متوجه شود که گربه روی پادری نشسته است تا اینجای کار هیچ معجزه‌ای در کار نبود فقط یک تابع علیت که به ما اجازه دسترسی به آینده را نمیداد.

مدل هوش مصنوعی

نکته : کد زیر ChatGPT نیست بلکه مشابه یک GPT یا بهتر است بگوییم نسخه‌های اولیه آن است

def create_model():
    inputs = layers.Input(shape=(maxlen,), dtype="int32")
    embedding_layer = TokenAndPositionEmbedding(maxlen, vocab_size, embed_dim)
    x = embedding_layer(inputs)
    transformer_block = TransformerBlock(embed_dim, num_heads, feed_forward_dim)
    x = transformer_block(x)
    outputs = layers.Dense(vocab_size)(x)
    model = keras.Model(inputs=inputs, outputs=[outputs, x])
    loss_fn = keras.losses.SparseCategoricalCrossentropy(from_logits=True)
    model.compile(
        "adam",
        loss=[loss_fn, None],
    )  # No loss and optimization based on word embeddings from transformer block
    return model

در ابتدا مقدار ورودی را بررسی کنیم این ورودی از کجا خواهد آمد.

inputs = layers.Input(shape=(maxlen,), dtype="int32")

اگر به کد دقت کنید مقدار دریافت شده باید عددی باشد یعنی عبارت ["The", "cat", "sits", "on", "mat"] باید به شکل برداری نوشته شود مثلا چیزی مثل این [203 ,90 ,78 ,45 ,12]

embedding_layer = TokenAndPositionEmbedding(maxlen, vocab_size, embed_dim)
x = embedding_layer(inputs)

در این قسمت هر کدام از مقادیر ورودی به یک بردار 128 بعدی تبدیل میشوند که بتوان چیزی شبیه به معنا برای آنها به زبان ماشین درست کرد. اجازه بدهید کمی این مطلب را باز کنیم

ماجرای ۱۲۸ بعد چیست؟

کلمه گربه را فرض کنید این کلمه هیچ معنی‌ای برای ماشین ندارد. برای انکه آن را معنی دار کنیم باید هر ویژگی را با یک عدد به ماشین بفهمانیم مثلا اینکه یک موجود زنده است، یا خز دارد و... . این ویژگی‌ها در بردارهایی با ابعاد ۱۲۸ قابل ذخیره سازی و نمایش است. اما چرا این موضوع را توضیح دادم. جالب است بدانید که این اعداد هیچ مفهومی باز هم برای ماشین ندارند اما اگر به یک موتور هوش مصنوعی بگویید پادشاه یا سلطان متوجه مترادف بودن آنها میشود؟ این صرفا به تشابه بردار این دو کلمه مربوط میشود نه مفهوم آن دو.

خروجی مدل و تصمیم گیری

outputs = layers.Dense(vocab_size)(x)

همه چیز به دیکشنری ارائه شده vocab_size به مدل بستگی دارد که در اینجا یک مقدار با حدود ۲۰۰۰۰ کلمه است. حالا در مثال ما کلمه "روی" را فرض کنید مدل باید پیش بینی کند که پس از آن چه کلمه‌ای باید ظاهر شود یعنی مدل تصمیم میگیرد چه کلمه‌ای مناسب است. اما حقیقت در بررسی میزان خطا نهفته شده.

loss_fn = keras.losses.SparseCategoricalCrossentropy(from_logits=True)

پیش بینی مدل اندیس مثلا 250 است. این تا مقدار واقعی خطا دارد. بررسی میزان خطا و آموزش دوباره مدل به ما کمک میکند یاد بدهیم چه کلمه‌ای درست است.

جمع بندی

اگر به کد بالا یا کدهای مشابه در این موضوع نگاه بکنیم خواهیم دید که در هیچ کدام از آنها خبری از درک مفهوم آنچه ما به دنبال آن هستیم نیست! تنها عباراتی که باید باشند ساخته میشوند چیزی که به نظر صحیح است اما در پس ماجرا درکی از آنچه گفته میشود وجود ندارد. در واقع مقدار آموزش داده شده همه چیز را تعیین میکند. سوالی که برای خواننده محترم در این قسمت هنوز باقی مانده است اینکه زمانی که با چنین چت بات‌هایی صحبت میکنیم مانند ماشین حرف نمیزنند و شبیه به انسان از کلمات مختلف یا جمله بندی‌های متفاوت بهره میگیرند. اما ما گفتیم که این مدل‌ها مفهموم جملات را درک نمیکنند. با ما همراه باشید تا در مقاله آینده به بررسی راز پشت این موضوع بپردازیم.