<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های مجموعه دانش‌بنیان شناسا</title>
        <link>https://virgool.io/feed/@shenasa</link>
        <description></description>
        <language>fa</language>
        <pubDate>2026-06-30 18:07:27</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/845913/avatar/5TDKak.jpeg?height=120&amp;width=120</url>
            <title>مجموعه دانش‌بنیان شناسا</title>
            <link>https://virgool.io/@shenasa</link>
        </image>

                    <item>
                <title>آشنایی با Tensorflow XLA</title>
                <link>https://virgool.io/@shenasa/%D8%A2%D8%B4%D9%86%D8%A7%DB%8C%DB%8C-%D8%A8%D8%A7-tensorflow-xla-daiu9c74gajs</link>
                <description>یکی از نقاط قوت کتابخانه‌ی Tensorflow پویایی (dynamic) آن است. این ویژگی به محققان اجازه می‌دهد تا بتوانند ایده‌های خود را راحت‌تر و سریع‌تر بررسی کنند، بدون این که خود را درگیر ابعاد تک تک تنسورهای موجود در کد کنند. اما این ویژگی مثبت، باعث کاهش کارایی (performance) محاسبات تنسورفلو می‌شود. خیلی از اعمالی (operation) که توسط تنسورفلو انجام می‌شوند، به ابعاد داده‌ی ورودی وابسته‌ هستند و مشخص نبودن ابعاد تا زمان اجرا، باعث می‌شود که نتوان بسیاری از بهینه‌سازی‌ها را انجام داد، مانند بهینه‌سازی‌های مربوط به استفاده مجدد از حافظه که بدون دانستن حجم داده‌ها امکان‌پذیر نیست. Google در سال ۲۰۱۷، XLA را با این هدف معرفی کرد که راهکاری برای افزایش کارایی این کتابخانه با حفظ نقاط قوت کلیدی آن باشد.مفاهیم مقدماتیقبل از این که وارد مبحث XLA شویم، لازم است مروری بر برخی مفاهیم پایه‌ای کامپیوترها داشته باشیم.زبان ماشین، اسمبلی و زبان‌های برنامه‌نویسی سطح بالاکامپیوترها قادر به اجرای برنامه‌هایی هستند که به زبان ماشین نوشته شده باشند. زبان ماشین یک زبان سطح پایین است که از کدهای باینری تشکیل شده است. تمامی کدهایی که به هر کدام از زبان‌های برنامه‌نویسی نوشته شده باشند، برای اجرا باید در نهایت به زبان ماشین تبدیل شوند.زبان اسمبلی یک زبان برنامه‌نویسی سطح پایین است که ارتباط قوی‌ای با زبان ماشین دارد. برنامه‌های نوشته‌شده به این زبان به آسانی توسط اسمبلرها به زبان ماشین تبدیل می‌شوند. هرچند کدهای این زبان برای انسان‌ها قابل فهم است، اما کسی که بخواهد به این زبان برنامه‌نویسی کند، باید با مفاهیم سخت‌افزاری آشنایی داشته باشد.از این رو برنامه‌نویس‌ها معمولا ترجیح می‌دهند با زبان‌های سطح بالاتر که درکشان برای انسان‌ها راحت‌تر است کار کنند. این برنامه‌ها بعدا به روش‌های مختلف به اسمبلی یا زبان ماشین تبدیل و اجرا می‌شوند.کامپایلر و مفسرکامپایلرها و مفسرها هر دو وظیفه دارند تا برنامه‌های نوشته‌شده به زبان سطح بالا را به زبان ماشین تبدیل کنند. کامپایلرها این کار را قبل از اجرای برنامه انجام می‌دهند. آن‌ها کدهای نوشته‌شده در زبان برنامه‌نویسی سطح بالا را بررسی کرده و در صورت عدم وجود خطا آن را به یک فایل اجرایی با زبان ماشین تبدیل کرده و ذخیره می‌کنند. اما مفسرها این تبدیل را هم‌زمان با اجرای کد انجام می‌دهند. از این رو، مفسرها تنها خطوطی از برنامه را به زبان ماشین تبدیل می‌کنند که نوبت به اجرای آن‌ها برسد و لزوما کل برنامه را بررسی نمی‌کنند.با توجه به این که کامپایلرها قبل از اجرا کد زبان ماشین را تولید کرده‌اند، اجرای آن‌ها نسبت به مفسرها سریع‌تر است. هم‌چنین چون کامپایلرها کل برنامه را قبل از تولید کد ماشین می‌بینند، می‌توانند بهینه‌سازی‌های مختلفی بر روی آن انجام دهند. اما به همین دلیل، لازم است تا تمامی نوع داده‌ها از قبل مشخص باشد و از این رو زبان‌های کامپایلری نمی‌توانند پویایی نوع داده‌ها (Dynamic typing) داشته باشند. C و C++ نمونه‌هایی از زبان‌های کامپایلری و python و PHP نمونه‌هایی از زبان‌های مفسری هستند.معرفی XLAمترجم XLA یا Accelerated Linear Algebra کامپایلری‌ست که به صورت اختصاصی برای محاسبات جبر خطی طراحی شده است و به برنامه‌نویسان اجازه می‌دهد بدون ایجاد تغییر اساسی در کدهای خود، سرعت اجرا را بالا ببرند. XLA با هدف افزایش سرعت اجرا، بهبود استفاده از حافظه و استفاده‌ی راحت‌تر از مدل روی موبایل‌ها و دیگر دستگاه‌ها توسعه داده شده است. همان‌طور که در تعریف کامپایلرها گفتیم، آن‌ها کدهای سطح بالا را به کد ماشین ترجمه می‌کنند. این اتفاق در XLA هم می‌افتد. به بیان دیگر، هر چیزی که بتوان آن را به گراف XLA تبدیل کرد، قابل ترجمه به زبان ماشین است.تبدیل گراف XLA به کد ماشینبرای این کار، XLA در دو مرحله کدها را بهینه می‌کند که می‌توان آن‌ها را در نمودار زیر دید.بهینه‌‌سازی کدها توسط XLA (منبع)زبان ورودی این کامپایلر XLA HLO یا High Level Operations است که می‌توان آن را به عنوان نمایش میانی دستورات در نظر گرفت. در مرحله اول، بهینه‌سازی‌هایی صورت می‌گیرند که به ماشین هدف وابسته نیستند و در مرحله بعد، بهینه‌سازی‌های دیگری با در نظر گرفتن ماشین مقصد انجام شده و سپس کد ماشین مربوطه تولید می‌شود.یکی از مهم‌ترین بهینه‌سازی‌هایی که توسط XLA انجام می‌شود، ترکیب (fusion) است. به عنوان مثال، فرض کنید می‌خواهیم حاصل عبارت alpha*input0 + input1 را محاسبه کنیم. در حالت عادی و بدون XLA، برای محاسبه این عبارت دو کرنل اجرا می‌شوند، یکی برای ضرب و دیگری برای جمع. برای اجرای هر کدام از این کرنل‌ها، عملیات خواندن مقادیر ورودی از حافظه و ذخیره‌ی خروجی در آن تکرار می‌شود. اما می‌توان این دو عملیات را با هم ترکیب کرد. در این صورت با کاهش تعداد دفعات خواندن متغیرهای ورودی از حافظه و ذخیره نتیجه در آن، سرعت اجرای عملیات بالاتر می‌رود. به بیان دیگر، با استفاده از ترکیب یا fusion به جای دو تابع زیر، تابع سوم اجرا می‌شود.دو کرنل متفاوت ضرب و جمع (منبع)کرنل ترکیب‌شده (منبع)در تصویر زیر که از این ارائه برداشته شده است، کرنل‌های اجرا شده برای محاسبه‌ی قطعه کد سمت چپ با استفاده از Tensorboard Profiler دیده می‌شوند. همان‌طور که می‌بینید، بخش زیادی از عملگرها با یکدیگر ترکیب شده و به عنوان fusion در یک کرنل اجرا شده‌اند.مشاهده ترکیب کرنل‌ها در Tensorboard (منبع)معرفی TF2XLAتا کنون فهمیدیم که اگر یک گراف XLA داشته باشیم، می‌توانیم آن را کامپایل کرده و به کد ماشین‌ تبدیل کنیم، پس برای استفاده از XLA باید بتوانیم گراف تنسورفلو را به گراف XLA تبدیل کنیم. برای این که بفهمیم این تبدیل چگونه انجام می‌شود، بهتر است اول روند انجام محاسبات در تنسرفلو بدون استفاده از XLA را بررسی کنیم.روند انجام محاسبات در تنسورفلوهمان‌‌طور که در شکل فوق می‌بینید، کد تنسورفلویی که به زبان‌های مختلف نوشته شده است، در نهایت تبدیل به یک گراف تنسورفلویی می‌شود. در این گراف گره‌ها عملگر و یال‌ها عملوندها هستند و جهت آن‌ها جریان محاسبات را نشان می‌دهد. پس از ساخته شدن این گراف، مجری (Executer) گراف را پیمایش کرده و به دنبال گرهی می‌گردد که قابل محاسبه باشد و ورودی‌هایش آماده باشند. سپس، با توجه به عملگر و اطلاعات ماشین، از بین کرنل‌های مختلفی که به زبان C++ پیاده‌سازی شده‌اند، سریع‌ترین را انتخاب کرده و محاسبات را انجام می‌دهد.حال نمودار زیر را در نظر بگیرید که روند اجرا در زمان استفاده از XLA را نشان می‌دهد. همان‌طور که می‌بینید، مجری این حالت با حالت قبل تفاوتی ندارد، اما مجموعه‌ی کرنل‌ها متفاوت هستند. این کرنل‌ها حاصل عملیات را محاسبه نمی‌کنند، بلکه وظیفه دارند گراف تنسورفلو را به گراف XLA تبدیل کنند.روند تبدیل گراف تنسورفلو به گراف XLAتکرار این روند در نهایت بخش‌هایی از گراف اصلی را گراف‌های XLA تبدیل می‌کند که می‌توان آن‌ها را کامپایل کرد تا بتوان محاسبات مربوط به آن بخش را با سرعت بیشتری انجام داد. به این زیرگراف‌هایی که قابلیت تبدیل شدن به گراف XLA دارند خوشه یا cluster گفته می‌شود.بکارگیری XLA در تنسورفلواکنون که می‌دانیم کدهای تنسورفلو چگونه توسط XLA به کدهای قابل اجرا توسط ماشین تبدیل می‌شوند، نگاهی به روش‌های مختلف استفاده از این قابلیت در تنسورفلو می‌اندازیم.ترجمه‌ی JIT یا just in timeدر این روش تنسورفلو ابتدا بخش‌هایی از گراف را که قابلیت تبدیل شدن به XLA دارند پیدا می‌کند. توجه داشته باشید که همیشه نمی‌توان انتظار داشت که کل گراف قابلیت تبدیل شدن به گراف XLA را داشته باشد؛ چون بعضی از کرنل‌های تنسورفلو به دلیل پویایی زیاد، قابل کامپایل نیستند. به علاوه، گاهی ممکن است کامپایل کردن یک خوشه باعث به هم ریختن نظم گراف اصلی شود. به عنوان مثال، کامپایل زیرگراف در شکل زیر باعث می‌شود که پیدا کردن ترتیب مناسب برای محاسبه گره‌ها غیر ممکن شود. ایجاد بن‌بست در گراف‌هابرای همین ممکن است مانند شکل زیر، تنها بخش‌هایی از گراف قابلیت بازنویسی به XLA را داشته باشند.JITدر این شرایط، مجری یا executer بعد از پیدا کردن گره مناسب اجرا، بررسی می‌کند که آیا آن گره یک cluster است یا نه و در صورتی که با یک خوشه مواجه باشد، زیرگراف را گراف XLA تبدیل کرده و سپس‌ آن را به زبان ماشین ترجمه می‌کند. هم‌زمان با این روند caching هم اتفاق می‌افتد، به این معنی که اگر این زیرگراف کامپایل‌شده را جای دیگری از گراف اصلی داشته باشیم، از کدی که قبلا به زبان ماشین تبدیل شده برای محاسبه نتیجه استفاده می‌کند. با درنظر گرفتن کارهای تکراری زیادی که در روند یادگیری ماشین اتفاق می‌افتد، می‌توان انتظار داشت که این تغییرات سرعت را بهبود بدهند.ترجمه‌ی AoT یا ahead of timeدر روش jit بخشی از گراف در زمان اجرا کامپایل می‌شد اما هدف AoT ترجمه کل گراف به صورتی است که مستقیما بر روی ماشین مقصد قابل اجرا باشد. برای این کار از ابزاری به نام tfcompile استفاده می‌شود. این ابزار، گراف تنسورفلو به همراه فایل تنظیماتی که در آن ورودی (feeds) و خروجی‌های (fetches) مدل مشخص می‌شوند را گرفته و با کمک XLA مدل را برای انواع ماشین‌های مختلف ترجمه می‌کند. خروجی tfcompile علاوه بر کدهای زبان ماشین، یک فایل C++ header نیز هست که چگونگی استفاده از مدل را مشخص می‌کند.AoTدر نمونه کد زیر، می‌توانید نحوه استفاده از کد تولید شده را در زبان C++ ببینید. در این‌جا کتابخانه test_matmul به روش AoT کامپایل شده است.استفاده از حاصل AoT (منبع)نمونه کددر این بخش برای درک بهتر چگونگی استفاده از XLA چندین نمونه کد را بررسی می‌کنیم.خوشه‌بندی خودکاردر این بخش به توضیح آموزش طبقه‌بندی CIFAR-10 با کمک خوشه‌بندی خودکار (auto-clustering) در XLA می‌پردازیم. این آموزش از سایت رسمی Tensoflow برداشته شده است و نوت‌بوک آن از طریق این لینک قابل دسترسی است.import tensorflow as tf

# Check that GPU is available: cf. https://colab.research.google.com/notebooks/gpu.ipynb
assert(tf.test.gpu_device_name())

tf.keras.backend.clear_session()
tf.config.optimizer.set_jit(False) # Start with XLA disabled.ابتدا تنسورفلو را ایمپورت کرده و پس از اطمینان از دسترسی به GPU،‌ قابلیت jit را برای آزمایش اولیه غیرفعال می‌شود.def load_data():
    (x_train, y_train), (x_test, y_test) = tf.keras.datasets.cifar10.load_data()
    x_train = x_train.astype(&#039;float32&#039;) / 256
    x_test = x_test.astype(&#039;float32&#039;) / 256
    # Convert class vectors to binary class matrices.
    y_train = tf.keras.utils.to_categorical(y_train, num_classes=10)
    y_test = tf.keras.utils.to_categorical(y_test, num_classes=10)
    return ((x_train, y_train), (x_test, y_test))

(x_train, y_train), (x_test, y_test) = load_data()تابع load_data جهت آماده‌سازی داده‌ها نوشته شده است. این تابع پس از بارگیری داده‌ها از دیتاست‌های تنسورفلو، تصاویر را نرمال کرده و برچسب‌ها را به فرمت one-hot در می‌آورد.def generate_model():
    return tf.keras.models.Sequential([
        tf.keras.layers.Conv2D(32, (3, 3), padding=&#039;same&#039;, input_shape=x_train.shape[1:]),
        tf.keras.layers.Activation(&#039;relu&#039;),
        tf.keras.layers.Conv2D(32, (3, 3)),
        tf.keras.layers.Activation(&#039;relu&#039;),
        tf.keras.layers.MaxPooling2D(pool_size=(2, 2)),
        tf.keras.layers.Dropout(0.25),
        tf.keras.layers.Conv2D(64, (3, 3), padding=&#039;same&#039;),
        tf.keras.layers.Activation(&#039;relu&#039;),
        tf.keras.layers.Conv2D(64, (3, 3)),
        tf.keras.layers.Activation(&#039;relu&#039;),
        tf.keras.layers.MaxPooling2D(pool_size=(2, 2)),
        tf.keras.layers.Dropout(0.25),
        tf.keras.layers.Flatten(),
        tf.keras.layers.Dense(512),
        tf.keras.layers.Activation(&#039;relu&#039;),
        tf.keras.layers.Dropout(0.5),
        tf.keras.layers.Dense(10),
        tf.keras.layers.Activation(&#039;softmax&#039;)
    ])

model = generate_model()یک مدل Sequential ساده برای آموزش طراحی شده و شئ model ساخته می‌شود.def compile_model(model):
    opt = tf.keras.optimizers.RMSprop(lr=0.0001, decay=1e-6)
    model.compile(loss=&#039;categorical_crossentropy&#039;,
        optimizer=opt,
        metrics=[&#039;accuracy&#039;])
    return model

model = compile_model(model)مدل با RMSprop optimizer کامپایل می‌شود.def train_model(model, x_train, y_train, x_test, y_test, epochs=25):
    model.fit(x_train, y_train, batch_size=256, epochs=epochs, validation_data=(x_test, y_test), shuffle=True)

def warmup(model, x_train, y_train, x_test, y_test):
    # Warm up the JIT, we do not wish to measure the compilation time.
    initial_weights = model.get_weights()
    train_model(model, x_train, y_train, x_test, y_test, epochs=1)
    model.set_weights(initial_weights)

warmup(model, x_train, y_train, x_test, y_test)
%time train_model(model, x_train, y_train, x_test, y_test)
scores = model.evaluate(x_test, y_test, verbose=1)تابع train_model با هدف آموزش مدل در ۲۵ epoch و تابع warmup برای آماده کردن مدل جهت محاسبه‌ی زمان نوشته شده‌اند. تابع warmup، وزن‌های اولیه مدل را نگه داشته و پس از آموزش مدل به اندازه یک epoch،‌ آن‌ها را مجدد بر روی مدل قرار می‌دهد. با این کار، وزن‌های مدل تغییری نمی‌کنند اما خوشه‌های پیداشده توسط JIT کامپایل می‌شوند. سپس هر دوی این توابع فراخوانی می‌شوند. این روند، در نهایت مدل را به دقت ۰.۶۳۸ بر روی داده‌های تست می‌رساند و اجرای تابع train_model، به اندازه‌ی ۵۷.۱ ثانیه سخت‌افزار را درگیر می‌کند.tf.keras.backend.clear_session()
tf.config.optimizer.set_jit(True) # Enable XLA.
model = compile_model(generate_model())
(x_train, y_train), (x_test, y_test) = load_data()
warmup(model, x_train, y_train, x_test, y_test)
%time train_model(model, x_train, y_train, x_test, y_test)حال، می‌خواهیم تاثیر استفاده از JIT را بررسی کنیم. برای این کار ابتدا session را پاک کرده و سپس XLA JIT را فعال می‌کنیم. با این کار، زیرگراف‌هایی که قابلیت کامپایل شدن دارند، در اولین epoch ترجمه می‌شوند. سپس مدل را مجدد تعریف کرده و توابع warmup و train_model را مجدد فراخوانی می‌کنیم. می‌بینیم که این بار زمان آموزش مدل به ۴۹.۹ ثانیه کاهش پیدا کرده که می‌توان گفت سرعت آموزش مدل ۱.۱۴ برابر بهتر شده است.اعداد گزارش‌شده در بالا از روی آموزش‌های تنسورفلو گفته شده‌اند. در تکرار این آزمایش توسط تیم شناسا بر روی Tesla T4 GPU، زمان آموزش بدون JIT برابر با ۱:۲۶ بود که پس از فعال‌سازی JIT به ۵۳.۱ ثانیه کاهش یافت که برابر با ۱.۶۲ برابر شدن سرعت آموزش است.فعال‌سازی JIT با استفاده از tf.function و jit_compile=Trueدر مثال فوق، قابلیت autoclustering را فعال کردیم تا تمامی خوشه‌های ممکن به صورت خودکار پیدا شوند. به جای این کار، می‌توانیم XLA را تنها برای بخش‌های خاصی از کد فعال کنیم. در این بخش این آموزش از سایت Tensorflow را بررسی می‌کنیم که برای فعال‌سازی JIT از tf.function استفاده کرده است.import tensorflow as tf
tf.compat.v1.enable_eager_execution()
# Size of each input image, 28 x 28 pixels
IMAGE_SIZE = 28 * 28
# Number of distinct number labels, [0..9]
NUM_CLASSES = 10
# Number of examples in each training batch (step)
TRAIN_BATCH_SIZE = 100
# Number of training steps to run
TRAIN_STEPS = 1000ابتدا تنسورفلو را ایمپورت کرده و برخی مقادیر لازم مقداردهی می‌شوند.# Loads MNIST dataset.
train, test = tf.keras.datasets.mnist.load_data()
train_ds = tf.data.Dataset.from_tensor_slices(train).batch(TRAIN_BATCH_SIZE).repeat()

# Casting from raw data to the required datatypes.
def cast(images, labels):
    images = tf.cast(tf.reshape(images, [-1, IMAGE_SIZE]), tf.float32)
    labels = tf.cast(labels, tf.int64)
    return (images, labels)سپس دیتاست MNIST از مجموعه داده‌های تنسورفلو بارگیری شده و تغییرات لازم مانند تغییر نوع داده‌ها بر روی آن اعمال می‌شود.layer = tf.keras.layers.Dense(NUM_CLASSES)
optimizer = tf.keras.optimizers.Adam()در این مساله برای آموزش مدل از یک تک‌لایه‌ی Dense به همراه بهینه‌ساز Adam استفاده می‌شود.@tf.function(jit_compile=True)
def train_mnist(images, labels):
    images, labels = cast(images, labels)
    with tf.GradientTape() as tape:
        predicted_labels = layer(images)
        loss = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(
            logits=predicted_labels, labels=labels
        ))
    layer_variables = layer.trainable_variables
    grads = tape.gradient(loss, layer_variables)
    optimizer.apply_gradients(zip(grads, layer_variables))تابع train_mnist برای آموزش مدل تعریف شده است. این تابع پس از گرفتن تصاویر و برچسب‌های مربوطه، عملیات back propagation را با استفاده از tf.GradientTape شبیه‌سازی می‌کند. توجه کنید که کل این تابع تحت tf.function decorator اجرا می‌شود. با پاس دادن jit_compile=True به این decoreator، قابلیت JIT فعال می‌شود.for images, labels in train_ds:
    if optimizer.iterations &gt; TRAIN_STEPS:
        break
    train_mnist(images, labels)

images, labels = cast(test[0], test[1])
predicted_labels = layer(images)
correct_prediction = tf.equal(tf.argmax(predicted_labels, 1), labels)
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
print(&amp;quotPrediction accuracy after training: %s&amp;quot % accuracy)در نهایت با اجرای این کد مدل به اندازه‌ی ۱۰۰۰ گام آموزش داده می‌شود که این کار مدل را به دقت ۰.۸۷۲۱ بر روی داده‌های تست می‌رساند.print(train_mnist.experimental_get_compiler_ir(images, labels)(stage=&#039;hlo&#039;))با اجرای تکه کد فوق می‌توانید دستورات کامپایل‌شده توسط XLA را ببینید. پیشنهاد می‌شود خروجی‌های این دستور را به ازای stage های مختلف (hlo, hlo_serialized, optimized_hlo, optimized_hlo_serialized, optimized_hlo_dot) و بر روی سخت‌افزارهای مختلف مشاهده کنید.امیدواریم از خواندن مطلب استفاده کرده باشید. برای مطالعه بیشتر، پیشنهاد می‌شود این لینک را جهت آشنایی با مشکلات شایع در کار با XLA و این لینک را جهت استفاده از AoT بخوانید. هم‌چنین می‌توانید بخش پایانی ویدیوی موجود در این لینک را جهت تحلیل بهتر بهبودهای حاصل از استفاده از XLA مشاهده کنید.کار بر روی Tensorflow XLA همچنان ادامه دارد. توسعه‌دهندگان تیم Tensorflow بر این باورند که قابلیت‌های این کامپایلر بیشتر از این‌هاست و امیدوارند که بتوانند در بهبودهای آتی فرآیند زمان‌بر آموزش مدل‌های سنگین را کوتاه‌تر کنند.نویسنده: بهار برادران افتخاریمنابع:2017 EuroLLVM Developers’ Meeting: D. Majnemer “XLA: Accelerated Linear Algebra”XLA: TensorFlow, Compiled! (TensorFlow Dev Summit 2017)How to make TensorFlow models run faster on GPUsPerformance Analysis of Accelerated Linear Algebra Compiler for TensorFlowAssembly Language DefinitionCompiler Vs. Interpreter: What’s the Difference?XLA: Optimizing Compiler for Machine Learning | TensorFlow</description>
                <category>مجموعه دانش‌بنیان شناسا</category>
                <author>مجموعه دانش‌بنیان شناسا</author>
                <pubDate>Mon, 05 Sep 2022 13:02:36 +0430</pubDate>
            </item>
                    <item>
                <title>مروری بر طبقه بندی متن - Text Classification</title>
                <link>https://virgool.io/@shenasa/fast-text-classification-dnsbukymjhl3</link>
                <description>متون موجود در سراسر وب می‌توانند منبع غنی از اطلاعات مفید باشند، اما استخراج اطلاعات از آن ها کاری سخت و زمان بر است. که امروزه به لطف روش های پردازش زبان طبیعی و یادگیری ماشین که هر دو زیر شاخه ای از هوش مصنوعی حساب می‌شوند، آنالیز، مرتب سازی و دسته بندی خودکار متون آسان تر شده است. در این پست از وبلاگ شناسا به مروری بر چیستی و روش های موجود برای طبقه بندی متن یا Text Classification می‌پردازیم.فهرست مطالب:- طبقه بندی متن چیست؟- چرا طبقه بندی متن مهم است؟- الگوریتم های طبقه بندی متن چه طور کار می‌‌کنند؟- کاربرد های طبقه بندی متن- معرفی یک ابزار پایتونی برای طبقه بندی متن - Fast Text-astforwardlabs عکس ازطبقه بندی متن چیست؟طبقه بندی متن یک تکنیک یادگیری ماشین است که مجموعه ای از دسته های از پیش تعریف شده را به متن مورد نظر ما نسبت می‌دهد. الگوریتم های طبقه بندی متن در قلب بسیاری از سیستم های نرم افزاری وجود دارند. به عنوان مثال سرویس ایمیلی که تشخیص می‌دهد ایمیل ورودی باید به پوشه ایمیل های هرز (spam) برود یا نه. یا وبسایتی مشابه ویرگول که مطالب منتشر شد توسط کاربران را ابتدا طبقه بندی می‌کند و سپس بسته به علایق شما مطالب مورد نظر را به شما پیشنهاد می‌دهد.چرا طبقه بندی متن مهم است؟!تخمین زده می‌شود که حدود ۸۰ درصد کل محتوای موجود در وب داده های بدون ساختار هستند. متن یکی از رایج ترین انواع داده های بدون ساختار است که به این دلیل ماهیت بدون ساختار آن تجزیه و تحلیل، مرتب سازی و سازماندهی داده های متنی کاری سخت و زمان بر است. همینطور که قبلا اشاره شد، اینجا است که روش های پردازش زبان طبیعی و یادگیری ماشین به کمک شرکت ها و تولید کنندگان نرم افزار می‌آیند تا این قبیل از کار ها را سریع تر و مرقون به صرفه تر انجام بدهند.الگوریتم های طبقه بندی متن چه طور کار می‌کنند؟به طور کلی عمل طبقه بندی متن به دو روش دستی و خودکار قابل انجام است. روش دستی به این معنی است که یک انسان محتوای متن مورد نظر ما را تفسیر کرده و بر اساس آن متن را طبقه بندی کند. این روش نتایج خوبی دارد اما به شدن زمان بر و گران است. روش خودکار نیز به این معنی است که با استفاده از تکنیک های یادگیری ماشین و پردازش زبان طبیعی به صورت خودکار متن مورد نظر را دسته بندی کنیم. این روش بسیار سریع تر، مرقون به صرفه تر و دقیق تر است!همه‌ی روش های موجود در حوزه طبقه بندی متن به روش خودکار در ۳ دسته قرار می‌گیرند:۱- روش های مبتنی بر قانون این روش های با استفاده از یک مجموعه قواعد و شرایط دست ساز اقدام به طبقه بندی متن می‌کنند. به طور مثال فرض کنید قصد طراحی سیستمی داریم که قرار است تصمیم بگیرد یک متن خبر ورزشی است یا سیاسی. در این صورت ابتدا باید یک لیست از کلمات مرتبط با ورزش و یم لیست از کلمات مرتبط با موضوعات سیاسی درست کنیم. و سپس موقع طبقه بندی متن مورد نظر، تعداد کلمات مرتبط با ورزش در متن و همچنین تعداد کلمات مرتبط با سیاست را که در ۲ لیست از پیش ساخته ما وجود دارند می‌شماریم. و در نهایت متن را در دسته ای فرض می‌کنیم که بیشترین تعداد کلمات مرتبط را داشته است.۲- روش های مبتنی بر یادگیری ماشین در روش‌های مبتنی بر یادگیری ماشین به جای تکیه در قوانین دستی از قبل ساخته شده، الگوریتم ما یاد می‌گیرد که بر اساس تجربیات گذشته خود متون را طبقه بندی کند. این روش های با استفاده از ویژگی هایی که از متن استخراج می‌کنند اقدام به یادگیری نحوه طبقه بندی کردن آن متن می‌کنند.۳- روش های هیبریدیسیستم های هیبریدی در واقع ترکیبی از دو روش قبلی هستند. به این منظور که نتایج نهایی سیستم بهبود پیدا کنند و هر الگوریتم معایب الگوریتم دیگر را بپوشاند.کاربرد های طبقه بندی متندر این قسمت به طور خلاصه به پر اهمیت ترین کاربرد های موجود برای الگوریتم های طبقه بندی متن می‌پردازیم. ۱. تحلیل احساسات - Sentiment Analysisتشخیص احساسات از روی متنفرآیند خودکار طبقه بندی متن به قطبیت های احساسی مثبت، منفی، خنثی، شاد، عصبانی و غیره.این سیستم ها به طور گسترده در تجزیه و تحلیل محصولات با استفاده از نظرت کاربران، تحقیقات بازار، پشتیبانی مشتری مورد استفاده قرار می‌‌گیرند.۲- تشخیص زبان - Language Detectionتشخیص زبان متن فرآیندی که طی آن متن ورودی بر اساس زبان (به طور مثال:‌ انگلیسی یا فارسی) طبقه بندی می‌شود.می‌تواند به این منظور استفاده شود که در قسمت پشتیبانی مشتریان بر اساس زبان آن ها خدمات ارائه کنیم.۳- تشخیص قصد - Intent Detectionبه طور مثال برای این منظور استفاده می‌‌شوند که قصد و هدف مشتری را از ایمیل ها، مکالمات و یا چت بات ها تشخیص دهیم و سپس به طور صحیح آن ها را به بخش مورد نظر هدایت کنیم.۴- تشخیص ایمیل هرز - Spam Detectionایمیل های هرز همیشه برای کاربران آزار دهنده هستند. اکثر سرویس های ایمیلی مثل Gmail برای تشخیص ایمیل های دریافتی هرز، آن را بر اساس ویژگی هایی مثل آدرس ایمیل، لینک مخرب، عبارت مشکوک و غیره بررسی می‌کنند.۵- تشخیص موضوع - Topic Detectionبه طور مثال برای تشخیص اینکه متن مورد نظر یک خبر مرتبط با موضوعات تکنولوژی است یا مربوط به اقتصاد. به طور مثال می‌توان از این کاربرد در طراحی سیستم های پیشنهاد دهنده استفاده کنیم.معرفی یک ابزار پایتونی برای طبقه بندی متن - Fast Textکتابخانه پایتونی Fast Text برای طبقه بندی متن فست تکست یا Fast Text یک کتابخانه پایتونی اوپن سورس، رایگان و توسعه داده شده توسط شرکت فیسبوک است. به کاربران این امکان را می‌دهد که عمل طبقه بندی متن را انجام دهند. توانایی کار روی سخت افزار های عمومی را دارد. برای یادگیری مدل خود نیازی به استفاده از پردازنده های گرافیکی (GPU) ندارد و سرعت بسیار قابل توجهی در یادگیری بر روی CPU دارد.برای آموزش مدل Fast Text به لیست متن های مورد نظر خودتان و برچسب های نظیر آن ها نیاز دارید.همچنین این ابزار توانایی انجام طبقه بندی چند برچسبی یا Multi-label classification را نیز دارد. برای بهبود عملکرد مدل نیز می‌توانیم تعیین کنید که مدل بر اساس چه n-gram ای اقدام به یادگیری کند.همچنین بخوانید:- کامپیوترها چگونه زبان‌ را درک می‌کنند؟ (مروری بر پردازش زبان طبیعی)- مقدمه‌ای بر شبکه‌های عصبی بازگشتی (RNNs)منابع:- Fast Text- Text Classification: What it is And Why it Matters-  5 Examples of Text Classification in Practice</description>
                <category>مجموعه دانش‌بنیان شناسا</category>
                <author>مجموعه دانش‌بنیان شناسا</author>
                <pubDate>Sun, 17 Jul 2022 15:21:42 +0430</pubDate>
            </item>
                    <item>
                <title>مقدمه‌ای بر شبکه‌های عصبی بازگشتی - جلسهٔ پنجم</title>
                <link>https://virgool.io/Rocket/%D9%85%D9%82%D8%AF%D9%85%D9%87-%D8%A7%DB%8C-%D8%A8%D8%B1-%D8%B4%D8%A8%DA%A9%D9%87-%D9%87%D8%A7%DB%8C-%D8%B9%D8%B5%D8%A8%DB%8C-%D8%A8%D8%A7%D8%B2%DA%AF%D8%B4%D8%AA%DB%8C-%D8%AC%D9%84%D8%B3%D9%87%D9%94-%D9%BE%D9%86%D8%AC%D9%85-kvyu0wlnanmg</link>
                <description>پس از یک وقفه‌ی نسبتاً طولانی،‌ در جلسه‌ی پنجم از دوره‌ی «مقدمه‌ای بر شبکه‌های عصبی بازگشتی (RNN)»،  محوشدگی و انفجار گرادیان دو مشکل اصلی شبکه‌‌های عصبی بازگشتی ساده (Simple RNN) را بررسی می‌کنیم.تطبیق با دوره ویدئویقسمت ششم (۱۹ دقیقه) – محوشدگی و انفجار گرادیان‌ها در شبکه‌های بازگشتیمروردر جلسه‌‌ی چهارم دوره، خاصیت اشتراک وزن‌ها (Weight Sharing [یا  Parameter Sharing]) شبکه‌های RNN را بررسی کردیم و دیدیم که چگونه می‌توانیم شبکه را برای داده‌هایی با گام‌های زمانی (Timestep) مختلف اجرا کنیم.مقدمهدر این جلسه، به بررسی محو‌شدگی گرادیان (Vanishing Gradient) و انفجار گرادیان (Exploding Gradient)، دو مشکل رایج شبکه‌های عصبی پرداخته و بررسی می‌کنیم که چه عاملی باعث ایجاد آن‌ها می‌شود و چرا در شبکه‌های بازگشتی شدت بیشتری دارند. لازم به ذکر است، در جلسات آینده به معرفی و بررسی شبکه‌های GRU و LSTM می‌پردازیم که راه‌حل‌هایی برای مشکلات فوق هستند.مزایای RNN سادهپیش از بررسی مشکلات شبکه‌ی عصبی بازگشتی ساده، لازم است توجه کنیم که شبکه‌های RNN ساده با وجود مشکلاتی که اشاره خواهیم کرد،‌ به‌دلیل داشتن تعداد پارامتر‌های بسیار کم (به نسبت شبکه‌های GRU و LSTM که در جلسات آینده با آن‌ها آشنا خواهیم شد) و همچنین دقت قابل قبول در مسائل نسبتاً ساده و سری‌های زمانی کوتاه، همچنان گزینه‌ی مناسبی هستند.معایب RNN سادهمشکل اصلی شبکه‌های عصبی بازگشتی ساده (Simple RNN) کم‌حافظه بودن آن‌هاست. این بدین معنی است که اگر یک دنباله (سری‌زمانی) به اندازه‌ی کافی طولانی باشد، این شبکه‌ها نمی‌توانند اطلاعات چندانی را از مراحل زمانی قبل‌تر انتقال دهند. به مثال زیر توجه کنید:فرض می‌کنیم می‌خواهیم متن «What time is it» را به یک شبکه‌ی عصبی بازگشتی بدهیم تا پاسخ آن را بدهد. همچنین فرض می‌کنیم که در هر گام زمانی، یک کلمه‌ خوراک می‌شود. در این صورت، هدف شبکه این خواهد بود که بفهمد اصل سوال چیست و آن را کد کند. می‌دانیم که در هر گام زمانی، پارامترهای شبکه متشکل از ورودی آن گام و حافظه‌‌ی نهان (Hidden State) گام قبلی خواهد بود. بنابراین همانطور که در نمودار فرضی زیر مشخص است، تاثیر هر کلمه با پیشرفت شبکه در طول سری‌زمانی کاهش می‌یابد:شمایی از وزن‌های شبکه با خوراک جمله What time is itاین اتفاق باعث می‌شود تا اطلاعات موجود در داده‌های ابتداییِ دنباله‌ی ورودی با پیشروی شبکه در داده‌ها به‌تدریج از بین رفته و از دسترس خارج شود. این مشکل کم‌حافظه‌بودنِ شبکه‌های عصبی بازگشتی ساده (Simple RNN)، به‌دلیل پدیده‌ی محو‌شدگی گرادیان (Vanishing Gradient) اتفاق می‌افتد. محوشدگی گرادیان و انفجار گرادیان (Exploding Gradient) دو مشکل اصلی در شبکه‌های عصبی بازگشتی هستند که باعث می‌شوند این شبکه‌ها در فهم دنباله‌های طولانی عملکرد مناسبی نداشته باشند.محوشدگی گرادیان (Vanishing Gradient)مشکل محوشدگی گرادیان که در شبکه‌های پیش‌خور (Feed Forward) نیز رایج است،‌ ناشی از کم‌شدن میزان گرادیانِ محاسبه‌شده در الگوریتم گرادیان کاهشی (Gradient descent) به‌دلیل ضرب‌های متعدد وزن‌ها در اعداد بین ۰ و ۱ است که باعث کوچک‌ترشدنِ میزانِ خطا شده و با حرکت به سمت لایه‌های نزدیک به ابتدای شبکه شدیدتر می‌شود. نتیجه‌ی این کم شدن گرادیان، عدم بروزرسانی وزن‌ها و درواقع اتفاق نیفتادن «یادگیری» در لایه‌های ابتدایی‌ست.یادآوریفرمول کلی محاسبه وزن‌ها برابر بود با:new Weight = Weight - Learning rate * Gradientنکته: نحوه‌ی Backpropagation در شبکه‌های عصبی بازگشتیبه‌عنوان‌مثال تصور کنید که یک دنباله به طول ۱۰ به یک شبکه عصبی بازگشتی خوراک شود. در این صورت، سلول بازگشتی به تعداد ۱۰ بار، باز شده و به ازای هر ورودی یک خروجی محاسبه می‌کند. میزان خطا در انتهای هر تکرار محاسبه شده و در انتهای دنباله، خطای تجمعی و یا میانگین در طول سلول پخش شده و وزن‌ها را بروزرسانی می‌کند.در شبکه‌های عصبی بازگشتی، از آن‌جایی‌که طول دنباله‌های ورودی می‌توانند به مراتب طولانی باشد و یک سلول بازگشتی (RNN Cell) یکسان در تمامی گام‌های زمانی استفاده و وزن‌های آن بروزرسانی می‌شود،‌ این مشکل شدیدتر بروز پیدا می‌کند؛ چرا که وزن‌های سلول در هر بار تکرار یکسان بوده و مدام در خود ضرب می‌شوند.نکتهدر شبکه‌های پیش‌خور وزن‌ها عموما تصادفی بوده و احتمال خنثی‌کردن یکدیگر وجود دارد. بنابراین محو‌شدگی گرادیان عموما کمتر اتفاق می‌افتد.به نمودار زیر دقت کنید:نموداری از یک واحد عصبی باز (unroll) شدهدر باز (unroll)شدن یک شبکه‌ی عصبی بازگشتی، ورودی هر مرحله در وزن‌ها ضرب شده و نتیجه به‌عنوان خروجی، در کنار ورودی مرحله‌ی بعدی در وزن‌ها ضرب می‌شود. بنابراین با‌توجه‌به اینکه وزن‌ها در هر بار تکرار یکسان است می‌توانیم داشته باشیم:x(n) = W^n * x(0)بنابراین درصورتی‌که گرادیان کوچک (بین ۰ تا ۱) ایجاد شود این مقدار به تعداد گام‌های زمانی در خود ضرب شده و به‌سرعت کوچک می‌شود که منجر به محوشدگی گرادیان می‌شود.انفجار گرادیان (Exploding Gradient)در قسمت قبل دیدیم که ضرب مکرر وزن‌های یکسان در شبکه‌های بازگشتی ساده منجر به کوچک‌شدن گرادیان شده و یادگیری شبکه را مختل می‌کند. حال اگر مقداری بزرگ (بزرگ‌تر از ۱) برای وزن‌ها ایجاد شود، گرادیان به سرعت (نمایی) بزرگ شده و در نتیجه انفجار گرادیان اتفاق می‌افتد:W^n * x(0) {
    w &gt; 1 ? infinite;
    w &lt; 1 ? 0;
}پیشگیری از پدیده‌ی انفجار گرادیان به مراتب ساده‌تر از پیش‌گیری از محو‌شدگی گرادیان است. برای مثال با استفاده از قرار دادن شرط حد برای محدود کردن گرادیان‌ها (Gradient Clipping) و یا استفاده از توابع فعال‌سازی که از ایجاد مقادیر غیرنرمال جلوگیری می‌کنند (مانند تابع tanh) می‌توان این مشکل را تا حد خوبی کنترل کرد.اتصالات پرشی (Skip Connections)در شبکه‌های پیش‌خور، یکی از راه‌حل‌ها برای عمیق کردن شبکه‌ها ایجاد اتصالات پرشی بود تا داده‌های لایه‌های اولیه شبکه تاثیر خود را از دست ندهند. در شبکه‌های پیش‌خور لایه‌ها با یکدیگر متفاوت بوده و ایجاد اتصالات پرشی ممکن بود. اما در شبکه‌های عصبی بازگشتی ایجاد چنین اتصالاتی به راحتی ممکن نیست؛ چرا که اگر به‌صورت امری اتصالاتی بین دو لایه ایجاد کنیم، ساختار شبکه را ثابت کرده‌ایم و بنابراین قابلیت اشتراک وزن (weight sharing) و اجرا روی دنباله‌های با طول متفاوت را از دست خواهیم داد.در چند جلسه بعد با شبکه‌های LSTM و GRU آشنا خواهیم شد که با ایده‌هایی مشابه ایده اتصالات پرشی مشکلات شبکه‌های عصبی بازگشتی را رفع کرده‌اند.در این جلسه به بررسی دو مشکل رایج شبکه‌های عصبی بازگشتی یعنی محوشدگی و انفجار گرادیان‌ها (Exploding and Vanishing Gradients) در شبکه‌های بازگشتی پرداختیم و بررسی کردیم که چه عاملی باعث ایجاد آن‌ها شده و چرا در شبکه‌های بازگشتی شدت بیشتری دارند.در جلسه‌ی بعدی به معرفی و بررسی شبکه‌های بازگشتی GRU و LSTM می‌پردازیم که راه‌حل‌هایی برای مشکلات گفته شده هستند.می‌توانید لیست جلسات دوره را در این پست مشاهده کنید.جلسه‌ٔ قبلیجلسه‌ٔ بعدی (در دست انتشار)این دوره به کوشش علیرضا اخوان‌پور به‌صورت ویدئویی تهیه شده و به قلم محمدحسن ستاریان با نظارت ایشان به‌صورت متنی نگارش و توسط بهار برادران افتخاری ویرایش شده‌ست.در صورت تمایل به خرید دوره به‌صورت ویدئویی می‌توانید با استفاده از کد تخفیف rnn5 از ۲۰ درصد تخفیف بهره‌مند شوید.</description>
                <category>مجموعه دانش‌بنیان شناسا</category>
                <author>مجموعه دانش‌بنیان شناسا</author>
                <pubDate>Sun, 26 Jun 2022 22:19:45 +0430</pubDate>
            </item>
                    <item>
                <title>انواع هوش مصنوعی و تفاوت آن‌ها با هوش انسان</title>
                <link>https://virgool.io/@shenasa/%D8%A7%D9%86%D9%88%D8%A7%D8%B9-%D9%87%D9%88%D8%B4-%D9%85%D8%B5%D9%86%D9%88%D8%B9%DB%8C-%D9%88-%D8%AA%D9%81%D8%A7%D9%88%D8%AA-%D8%A2%D9%86-%D9%87%D8%A7-%D8%A8%D8%A7-%D9%87%D9%88%D8%B4-%D8%A7%D9%86%D8%B3%D8%A7%D9%86-jwsi5tuycozv</link>
                <description>بدون شک هوش مصنوعی یکی از پیچیده‌ترین و خارق‌العاده‌ترین ابداعات بشر تاکنون بوده است. به همین دلیل، می‌توان این واقعیت را بیان کرد که هنوز بسیاری از بخش‌های این دانش ناشناخته باقی مانده و هر برنامه‌ی مبتنی بر هوش مصنوعی که امروز با آن مواجه می‌شویم، تنها یک قسمت بسیار کوچک از این دانش وسیع به شمار می‌رود.با این وجود، پیشرفت‌های صورت‌گرفته در سال‌های اخیر، از جمله معرفی الگوریتم‌های یادگیری ماشین و پس از آن یادگیری عمیق، منجر به ایجاد این تصور شده است که هوش مصنوعی به سرعت در حال نزدیک شدن به هوش انسان‌هاست و در سال‌های آینده می‌تواند حتی فراتر از هوش انسان قدم بردارد.در این مقاله قصد داریم به بررسی انواع هوش مصنوعی بپردازیم  و بیان کنیم که دستاوردهایی که تا به امروز در حوزه‌ی هوش مصنوعی کسب شده است، مربوط به کدام نوع از هوش مصنوعی است. علاوه بر این، به مقایسه هوش مصنوعی و هوش انسان می‌پردازیم و توضیح می‌دهیم که آیا دستیابی به هوشی در سطح انسان امکان‌پذیر است یا خیر.انواع هوش مصنوعیوقتی مردم در مورد هوش مصنوعی صحبت می‌کنند، بیشتر افراد متوجه نمی‌شوند که انواع مختلفی از هوش مصنوعی وجود دارد. هوش مصنوعی ضعیف یا محدود تنها هوش مصنوعی است که امروزه وجود دارد. هوش مصنوعی قوی یا عمومی زمانی به دست می‌آید که ماشین‌ها توانایی‌هایی شناختی انسان‌ها را بدون دخالت انسانی داشته باشند.در ادامه به بررسی انواع هوش مصنوعی که در لیست زیر آمده می‌پردازیم و برای هر کدام مثال‌هایی را بیان خواهیم کرد.هوش مصنوعی محدود (Narrow AI)هوش مصنوعی عمومی (General AI)فراهوش (Super AI)هوش مصنوعی محدود (Narrow AI)هوش مصنوعی محدود که به آن هوش مصنوعی ضعیف (Weak AI) نیز گفته می‌شود، نوعی هوش مصنوعی است که بر روی یک وظیفه‌ی خاص متمرکز است. هوش مصنوعی ضعیف فاقد آگاهی انسانی است؛ ولی ممکن است در بعضی از موارد بتواند آن را شبیه‌سازی کند.الگوریتم‌های هوش مصنوعی ضعیف از طریق مدل‌سازی هوش انسان ساخته می‌شوند و به جای داشتن توانایی‌های شناختی کامل، مانند مغز انسان، قادرند وظایف خاصی را انجام دهند. این الگوریتم‌ها به کمک مجموعه‌ای از داده‌ها، آموزش داده می‌شوند و پس از آن می‌توانند داده‌های جدید را بر اساس آن‌چه که آموزش دیده‌اند، طبقه‌بندی کنند.هیچ راهی وجود ندارد که این سیستم‌ها از مسیری که برای آن‌ها برنامه‌ریزی شده است منحرف شوند. برای مثال، ماشین‌هایی که برای چیدن اقلام در انبار ایجاد می‌شوند، نمی‌توانند بدون دخالت انسان در یک رستوران کار کنند و سفارش مشتریان را تحویل دهند. در نتیجه هوش مصنوعی محدود رفتار هوشمند را برای کارهای خاصی مدل می‌کند.تقریبا همه‌ی کاربردهای هوش مصنوعی که روزانه با آن مواجه می‌شویم، در این گروه قرار دارند. در ادامه به بیان چند مثال از هوش مصنوعی محدود می‌پردازیم.دستیارهای صوتی دیجیتال (سیری، الکسا)دستیارهای صوتی دیجیتال مانند سیری و الکسا به عنوان بهترین نمونه‌های هوش مصنوعی ضعیف به شمار می‌روند که ما هر روز به آن‌ها اعتماد می‌کنیم. برای افزایش کارایی سیستم، هوش مصنوعی، داده‌های ورودی را طبقه‌بندی می‌کند و سپس به سوالات با سرعتی باورنکردنی پاسخ می‌دهد.سیستم‌های پیشنهاد دهندهنتفلیکس، آمازون و سایر وب‌سایت‌های خرده‌فروشی از الگوریتم‌های پیشنهاد دهنده برای پیشنهاد محصولات به کاربرانشان استفاده می‌کنند. این الگوریتم‌ها تاثیر بسیار زیادی بر روی افزایش فروش محصولات داشته‌اند.موتورهای جستجوگوگل و سایر موتورهای جستجو نیز نمونه‌هایی از کاربرد هوش مصنوعی ضعیف هستند. وقتی سوال خود را تایپ می‌کنید، الگوریتم شروع به جستجوی سوال در پایگاه داده وسیع خود می‌کند و با طبقه‌بندی آن، پاسخ سوال را پیدا می‌کند.چت‌بات‌هااگر تا به حال در قسمت چت با بخش پشتیبانی یک سازمان صحبت کرده‌اید، احتمالا مخاطب شما هوش مصنوعی بوده. بیشتر اوقات، قسمت پشتیبانی سایت‌ها یک چت بات منطبق بر هوش مصنوعی است که وظیفه پاسخگویی به سوالات رایج مشتریان را دارند. از این طریق نیروهای انسانی که قبلا این کار را انجام می‌دادند برای انجام کارهای مهم‌تر آزاد می‌شوند.وسایل نقلیه‌ی خودرانهوش مصنوعی که به وسایل نقلیه اجازه می‌دهد بدون راننده حرکت کنند، نمونه‌ای از هوش مصنوعی ضعیف است؛ اما این سیستم‌ها با یک چالش جدی مواجهند. از آن‌جایی که این نوع هوش مصنوعی مانند مغز انسان توانایی شناختی کاملی ندارد، برنامه‌ریزی و آموزش الگوریتم‌ها در مورد خطرات احتمالی و موقعیت‌هایی که وسیله‌ی نقلیه ممکن است با آن روبرو شود، دشوار است.تشخیص تصویر و گفتارهوش مصنوعی محدود می‌تواند در زمینه‌های مراقبت‌های بهداشتی کمک جدی‌ای به پزشکان کند. هوش مصنوعی ضعیف به رادیولوژیست‌ها کمک می‌کند تا بتوانند بیماری را از روی اسکن‌های گرفته شده از بیمار تشخیص دهند. علاوه بر این هوش مصنوعی ضعیف در سایر صنایع که نیاز به تشخیص تصاویر از طریق فناوری بینایی ماشین وجود دارد، کمک شایانی می‌کند.کاربرد دیگر هوش مصنوعی محدود در تشخیص گفتار است. پردازش زبان طبیعی (NLP) یکی از شاخه‌های هوش مصنوعی است که در زمینه‌های مختلف استفاده می‌شود. خدمات ترجمه مانند گوگل ترنسلیت نمونه‌ای از این کاربرد است.پیش‌بینی و تجزیه و تحلیل داده‌هاهوش مصنوعی محدود در تجزیه و تحلیل و پیش‌بینی استفاده می‌شود. الگوریتم‌های یادگیری ماشینی برای بررسی داده‌های تاریخی استفاده می‌شوند تا یک پیش‌بینی از یک نتیجه‌ی احتمالی در آینده تولید کنند. این کاربرد هوش مصنوعی ضعیف می‌تواند در بازارهای مالی و هر کسب و کاری که با داده سرکار دارد استفاده شود.ربات‌هادر حال حاضر، ربات‌ها دارای یک ذهن مجزا از ذهن انسا‌ها نیستند. پهپادها و ربات‌های ساخته شده با هوش مصنوعی محدود، در عمل قادرند مجموعه‌ی محدودی از اقداماتی را که برای آن‌ها برنامه‌ریزی شده‌اند، انجام دهند. به عنوان مثال، ربات‌های تحویل‌دهنده برای پیروی از دستورات فاصله‌گذاری اجتماعی و ربات‌های ضدعفونی کننده در طول همه‌گیری کرونا بسیار مفید بودند.هوش مصنوعی عمومی (General AI)در ایتدا باید بگوییم که هوش مصنوعی قوی یا عمومی در این مرحله صرفا به صورت تئوری مطرح شده است و هنوز دانشمندان نتوانسته‌اند به چنین هدفی نزدیک شوند. هوش مصنوعی عمومی همان هوش مصنوعی‌ای است که قطعا در بسیاری از فیلم‌های علمی-تخیلی مانند The Terminator یا I-Robot دیده‌اید.در نهایت، زمانی که ما به هوش مصنوعی عمومی دست یابیم، ماشین‌ها هوشیاری و مهارت‌های تصمیم‌گیری خواهند داشت که مشابه با توانایی‌های شناختی کامل انسان است. ماشین‌ها، بدون این که نیاز باشد انسان‌ها برایشان برنامه‌ریزی کنند، قادرند به صورت مستقل کارهایشان را انجام دهند. در این زمان ماشین‌ها قادرند مانند انسان‌ها احساس کنند، فکر کنند، تصمیم بگیرند و عمل کنند.دراقع می‌توان گفت که هوش مصنوعی قوی، ذهن مختص به خودش را دارد و می‌تواند هر کاری را درست مانند انسان انجام دهد. برخلاف هوش مصنوعی محدود که داده‌ها را کلاس‌بندی می‌کند و الگوی بین آن‌ها را پیدا می‌کند، هوش مصنوعی عمومی هنگام پردازش داده‌ها از خوشه‌بندی و ارتباط‌ها استفاده می‌کند.ایلان ماسک از جمله افرادی است که در این حوزه فعالیت کرده و در حال تلاش برای خلق هوش مصنوعی عمومی است. ایلان ماسک بنیان‌گذار، مدیرعامل و مهندس ارشد SpaceX است و همچنین سرمایه‌گذار، مدیرعامل و مدیر محصول شرکت تسلا است. تسلا، یک شرکت آمریکایی خودروهای الکتریکی و انرژی پاک است که در ایالت تگزاس مستقر است. این شرکت خودروسازی تولیدکننده خودروهای برقی و قطعات مورد نیاز قطارهای برقی است.شرکت تسلا در سال‌های اخیر بر روی طراحی و تولید خودروهای خودران و برنامه Teslabot فعالیت کرده است. Teslabot یک شبکه‌ی عصبی است که عملکردهای مغز انسان را تقلید می‌کند و به وسیله‌ی نقلیه اجازه می دهد تا محیط اطراف خود را از طریق دوربین‌ها تجزیه و تحلیل کند و با شناسایی و برچسب‌گذاری مسیرها و تصاویر مختلف، مشخص کند که هنگام برخورد با موانع چه کاری باید انجام دهد.ایلان ماسک قصد دارد از قدرت و منابع مالی شرکت تریلیون دلاری خود برای خلق AGI استفاده کند. تسلا از توانایی خود برای جذب و استخدام بهترین افراد برای هدف AGI فیزیکی استفاده می‌کند. او در حال بررسی خودروهای خودران Robotaxi به عنوان پله‌ای برای ربات‌های AGI در سطح انسان است.یکی از منتقدان این طرح و فردی که اعتقاد دارد AGI یک تکنولوژی دور از دسترس به شمار می‌رود، فرانسوا شوله (François Chollet) است. Chollet یک مهندس نرم‌افزار فرانسوی و محقق هوش مصنوعی است که در حال حاضر در گوگل کار می‌کند. Chollet خالق کتابخانه یادگیری عمیق Keras است که در سال 2015 منتشر شد و یکی از مشارکت‌کنندگان اصلی چارچوب یادگیری ماشینی TensorFlow است. تحقیقات او بر روی بینایی کامپیوتر، کاربرد یادگیری ماشینی در استدلال رسمی، انتزاع و چگونگی دستیابی به کلیت بیشتر در هوش مصنوعی تمرکز دارد.فرانسوا شوله در توییتی کنایه‌آمیز این گونه بیان می‌کند که «آموزش شبکه‌های بزرگ‌تر و استفاده از داده‌ی عظیم‌تر، همان‌قدر ما را به هوش مصنوعی قوی نزدیک‌تر می‌کند که ساختن برج‌های بلندتر ما را به ماه نزدیک‌تر می‌کند.»به طور کلی، هر کاری که انسان قادر به انجام آن است، توسط هوش مصنوعی عمومی نیز قابل انجام است. هوش مصنوعی عمومی از نظر فنی تمام پتانسیل مغز انسان را داراست؛ از این رو می‌تواند در هر زمینه‌ای اعم از ساختن یک قطعه‌ی موسیقی یا نوشتن یک داستان مانند انسان عمل کند. کارهایی که هوش مصنوعی عمومی می‌تواند انجام دهد شامل موارد زیر است:تعمیم دانش و استفاده از آن در زمینه‌های مختلفیکی از ویژگی‌های منحصر به فرد انسان‌ها این است که با تجربه کردن، یاد می‌گیرند. آن‌ها از تجربیات مختلف یاد می‌گیرند و آن را به‌صورت منطقی در موقعیت‌های دیگری که با آن مواجه می‌شوند به کار می‌برند. این نمونه‌ای از هوش مصنوعی قوی به شمار می‌رود.استفاده از دانش و تجربه‌ی به‌دست‌آمده جهت برنامه‌ریزی برای آیندهیکی دیگر از توانایی‌های انسان استفاده از تجربیات زندگی خود برای برنامه‌ریزی برای آینده است. هرچه آن‌ها با تجربیات بیشتری روبرو می‌شوند، می‌توانند از این تجربیات برای ایجاد یک برنامه‌ریزی و ساختن آینده استفاده کنند. در هوش مصنوعی محدود، ماشین‌ها برای برنامه‌ریزی به انسان‌ها تکیه دارند و قادر به اجرای برنامه‌ای برای آینده‌ی خود نیستند؛ اما در هوش مصنوعی عمومی، برنامه‌ریزی یک ویژگی ذاتی به شمار می‌رود.قابلیت سازگاری با شرایط تغییریافتهتوانایی سازگاری و وقف پیدا کردن (Adaptation) با شرایط مختلف، یکی دیگر از ویژگی‌های انسان‌هاست. هوش مصنوعی عمومی می‌تواند با شرایطی که با آن مواجه می‌شود سازگار شود، درحالی‌که هوش مصنوعی محدود تنها قادر به پاسخگویی به متغیرهایی است که در الگوریتم‌ها برنامه‌ریزی شده‌اند.توانایی استدلالبرخلاف هوش مصنوعی محدود، هوش مصنوعی عمومی قادر به استدلال کردن است. ماشین‌های هوش مصنوعی عمومی قادر خواهند بود یک موقعیت را بررسی کنند و اقدامات لازم را - حتی اگر خارج از محدوده‌ی چیزی باشد که یک انسان به آن آموزش داده است - تعیین کنند.عاقل بودنیکی دیگر از ویژگی‌های انسان، عقل است. اگر ماشین قرار است برای پاسخگویی به سوالات مختلف، به برنامه‌نویسی تکیه نکند، باید دارای ویژگی عقل سلیم باشد. هوش مصنوعی ضعیف از این ویژگی برخوردار نیست اما در هوش مصنوعی قوی به دلیل این که سیستم باید هم‌تراز با انسان عمل کند، وجود عقل ضروری است.توانایی تشخیص نیازها و احساساتهوش مصنوعی عمومی همچنین می‌تواند نیازها، احساسات، فرآیندهای فکری و باورهای موجودات هوشمند دیگر را درک کند. این موضوع تحت عنوان تئوری هوش مصنوعی سطح شناخته می‌شود. بر این اساس بیان می‌شود که چیزی برای شبیه‌سازی در این سطح از هوش مصنوعی وجود ندارد، بلکه ماشین‌ها واقعا انسان‌ها را درک می‌کنند.هرچند تا به امروز ما چیزهای زیادی در مورد مغز انسان آموخته ایم، اما هنوز چیزهای ناشناخته زیادی وجود دارد که نتوانسته‌ایم به آن‌ها پی ببریم. برای ایجاد هوش مصنوعی عمومی، درک کامل مغز انسان ضروری است.فراهوش (Super AI)منظور از فراهوش، سطحی از هوش است که بسیار هوشمندتر از مغز بزرگ‌ترین نوابغ انسانی است. نیک باستروم، فیلسوف دانشگاه آکسفورد، فراهوش را به‌صورت «یک عقل که در تمامی زمینه‌ها شامل نوآوری علمی، هوش عمومی و مهارت‌های اجتماعی بسیار هوشمندتر از بهترین مغزهای انسان‌هاست» تعریف می‌کند.با وجود این که تا به امروز در برخی از زمینه‌ها، هوش مصنوعی توانسته از انسان پیشی بگیرد، اما هیچ‌کدام از آن‌ها را نمی‌توان به عنوان فراهوش در نظر گرفت. به عنوان مثال هوش مصنوعی در بازی شطرنج توانست بزرگترین بازیکن شطرنج را شکست بدهد، اما این هوش در سایر زمینه‌ها حرفی برای گفتن ندارد.در مورد ساخت یا عدم ساخت فرا هوش نمی‌توان به قطعیت حرفی زد اما به‌وجود آمدن چنین هوشی می‌تواند منجر به تغییرات عظیمی در زندگی بشر شود و حتی ممکن است زندگی انسان‌ها را تهدید کند.نویسنده: بنیامین زارعیمنابع:1. Humans vs Robots: The Difference Between AI and AGI2. What is Weak (Narrow) AI? Here Are 8 Practical Examples3. What Is Strong (General) AI? Here Are 9 Practical Examples4. HOW LONG BEFORE SUPERINTELLIGENCE?5. Elon Musk Is Using Trillion Dollar Power to Create AGI</description>
                <category>مجموعه دانش‌بنیان شناسا</category>
                <author>مجموعه دانش‌بنیان شناسا</author>
                <pubDate>Tue, 17 May 2022 15:43:13 +0430</pubDate>
            </item>
                    <item>
                <title>کامپیوترها چگونه زبان‌ را درک می‌کنند؟ (مروری بر پردازش زبان طبیعی)</title>
                <link>https://virgool.io/@shenasa/nlp-%D9%BE%D8%B1%D8%AF%D8%A7%D8%B2%D8%B4-%D8%B2%D8%A8%D8%A7%D9%86-%D8%B7%D8%A8%DB%8C%D8%B9%DB%8C-kfl5fzb9pnxq</link>
                <description>آیا تا به حال به این فکر کرده‌اید که دستیارهای شخصی گوشی هوشمندتان چگونه ساخته شده است و بر چه اساسی کار می‌کنند یا چه طور جیمیل ایمیل‌های اسپم را به صورت خودکار تشخیص می‌دهد؟ برای پاسخ به این قبیل از سوال‌ها در این پست درباره‌ی چیستی و کاربردهای مختلف پردازش زبان طبیعی صحبت خواهیم کرد.تصویر از amenysپردازش زبان طبیعی چیست؟پردازش زبان طبیعی (Natural Language Processing یا NLP) شاخه‌ای از علوم کامپیوتر یا هوش مصنوعی است که به نحوه تعامل بین کامپیوتر و انسان با استفاده از زبان‌های طبیعی تمرکز کرده است. منظور از زبان طبیعی در این‌جا زبان‌هایی است که انسان‌ها ایجاد کرده‌اند (مانند فارسی و انگلیسی) و از طریق آن‌ها با یک‌دیگر ارتباط برقرار می‌کنند. هدف این علم قدرتمندسازی کامپیوترها برای درک محتویات اسناد (متن و صوت) است، به شکلی که کامپیوتر خود بتواند بینش‌های موجود در اسناد را استخراج و آن‌ها را دسته‌بندی و سازمان‌دهی کند.خلاصه‌ای از تاریخچه‌ی پردازش زبان طبیعیبرای پیدا کردن ریشه‌ی پردازش زبان طبیعی باید به دهه ۵۰ میلادی برگردیم. زمانی که آلن تورینگ مقاله‌ای با عنوان «Computing Machinery and Intelligence» را منتشر کرد، و در آن چیزی را بیان کرد که امروزه آن را با عنوان آزمون تورینگ (معیاری برای سنجش هوش کامپیوترها) می‌شناسیم. این آزمون پیشنهادی شامل وظیفه‌ای به نام «تفسیر خودکار و تولید زبان طبیعی» نیز بود.آلن تورینگبه طور کلی تاریخچه‌ی پردازش زبان طبیعی را می‌توانیم به سه قسمت تقسیم کنیم.۱- دوره‌ی پردازش زبان طبیعی نمادین یا Symbolic NLP (دهه ۵۰ تا اوایل دهه ۹۰ میلادی)این دوره به خوبی توسط جان سرل (John Searle) با آزمایش «اتاق چینی» توضیح داده شده است. در این آزمایش کامپیوتر با استفاده از مجموعه‌ی قوانینی (مانند یک کتاب عبارات چینی یا سوالات و پاسخ‌های مورد نظر آن‌ها) درک زبان طبیعی را تقلید می‌کند، و آن قوانین را بر روی هر داده‌ای که با آن مواجه می‌شود اعمال می‌کند.در طی این دوره سیستم‌های پردازش زبان طبیعی به شکل موفقیت‌آمیزی توسعه یافتند. از جمله‌ی این سیستم‌ها می‌توان به SHRDLU که در دهه ۶۰ میلادی به واسطه‌ی جهان بلوکی (blocks worlds) با واژگان محدودی کار می‌کرد، یا به ربات‌های گفتگو‌کننده Racter و Jabberwacky در دهه ۸۰ و اوایل دهه ۹۰ که روزهای اوج روش‌های نمادین بودند اشاره کرد.۲- دوره‌ی پردازش زبان طبیعی آماری یا Statistical NLP (دهه های ۱۹۹۰ تا ۲۰۱۰ میلادی)متوجه شدیم که تا اواخر دهه ۸۰ میلادی اکثر سیستم‌های پردازش زبان طبیعی بر اساس مجموعه‌ای پیچیده از قوانین دست‌نوشته کار می‌کردند. بعد از این دوره، با معرفی الگوریتم‌های یادگیری ماشین برای پردازش زبان طبیعی، انقلابی رخ داد که علت آن افزایش مداوم قدرت محاسباتی پیش‌بینی شده توسط قانون مور و کاهش تدریجی سلطه‌ی نظریه‌های چامسکی در زبان‌شناسی بود.در اوایل این دوره بسیاری از موفقیت‌های حاصل‌شده مربوط به ترجمه‌ی ماشینی (به‌ویژه به دلیل کارهای تحقیقاتی شرکت IBM) بود. سپس با رشد سریع وب مقدار زیادی از داده‌های زبانی خام در دسترس همگان قرار گرفت که این اتفاق باعث تمرکز گسترده‌ی تحقیقات بر روی الگوریتم‌های نظارت‌شده و بدون نظارت در این حوزه شد.۳- دور‌ه‌ی پردازش زبان طبیعی عصبی یا Neural NLP (دهه ۲۰۱۰ میلادی تا اکنون)در دهه‌ی ۲۰۱۰ بود که روش‌های یادگیری بازنمایی (representation learning) و یادگیری ماشین به سبک شبکه‌های عصبی عمیق در پردازش زبان طبیعی رایج شدند. انبوهی از نتایج نشان می‌داد که این روش‌ها توانایی خاصی در بسیاری از وظایف پردازش زبان طبیعی دارند.پردازش زبان طبیعی سخت است!زبان‌های ایجادشده توسط انسان‌ها به چند دلیل سیستم‌های پیچیده و خاصی هستند. نکته‌ی قابل توجه در زبان انسان‌ها این است که ما می‌توانیم یک معنا را به روش های مختلف (گفتار، اشاره، نشانه و غیره) بیان کنیم. به عنوان مثال تعداد نامتناهی روش مختلف برای چیدمان کلمات در یک جمله وجود دارد. هم‌چنین، کلمات می‌توانند معانی مختلفی داشته باشند و برای تفسیر صحیح جملات، اطلاعات متنی ضروری است. به علاوه آرایه‌های ادبی همچون ایهام و غیره در زبانی مثل فارسی می‌تواند کار را چندین برابر سخت‌تر کند.کاربردهای پردازش زبان طبیعیتحلیل احساسات یا Sentiment Analysisدرک زبان طبیعی سخت‌تر خواهد شد وقتی که بحث نظرات، کنایه‌ها و طعنه ها در میان باشد. تکنیک‌های تحلیل احساسات می‌توانند تفاوت‌های ظریف در احساسات و نظرات را تشخیص دهند و تعیین کنند که آن‌ها چقدر دارای بار مثبت یا منفی هستند. با تحلیل احساسات می‌توانید واکنش‌های مشتریان را نسبت به آخرین کمپین بازاریابی یا راه‌اندازی محصول جدید خود بسنجید، و یا حتی یک حس کلی از احساس مشتریان در مورد شرکت خود دریافت کنید.طبقه‌بندی متن یا Text Classificationبرچسب‌گذاری یک متن زبان طبیعی با دسته‌بندی‌های مرتبط به آن را طبقه‌بندی متن می‌گوییم. این دسته‌بندی‌ها که برای استخراج برچسب‌ها از متن بدون ساختار مورد استفاده قرار می‌گیرند از مجموعه‌ای از دسته‌های ازپیش‌تعریف‌شده می‌آیند. از جمله کاربردهای آن می‌توان به تشخیص کلاه‌برداری‌ها و سوء استفاده‌های آنلاین، دسته‌بندی اخبار وب‌سایت‌های گوناگون، تشخیص ناسزاگویی، تشخیص زبان یک متن، تشخیص ایمیل‌های اسپم و همچنین تحلیل احساسات اشاره کرد.چت‌بات ها و دستیارهای هوشمند یا Chatbots and Intelligent Assistantsچت‌بات‌ها و دستیارهای هوشمند برای پاسخ‌دهی خودکار به سؤالات استفاده می‌شوند و با هدف درک زبان طبیعی و ارائه‌ی پاسخ مناسب از طریق تولید زبان طبیعی طراحی شده‌اند. نکته‌ی قابل توجه این نوع از سیستم ها این است که از قوانین ازپیش‌تعریف‌شده برای پاسخ به سوالات استفاده نمی‌کنند، بلکه چت‌بات‌های مجهز به هوش مصنوعی و دستیاران هوشمند می‌توانند از هر تعاملی یاد بگیرند و بفهمند که چگونه باید به سوالات پاسخ دهند. این سیستم‌ها به طور انبوه برای کار‌هایی مانند پشتیبانی مشتریان مورد استفاده قرار می‌گیرند، زیرا می‌توانند به تیم‌ها کمک کنند تا حدود ۸۰ درصد از تمام درخواست‌های معمول را حل کنند و مسائل پیچیده‌تر را به سمت عوامل انسانی هدایت کنند.Google Assistantترجمه ماشینی یا Machine Translationبه طور کلی ترجمه‌ی خودکار متن یا گفتار یک زبان به زبانی دیگر را ترجمه‌ی ماشینی می‌گوییم. در طول این سال‌ها اگر از کاربران گوگل ترنسلیت بوده باشید متوجه شده‌اید که به لطف پیشرفت‌های عظیم در زمینه‌ی شبکه‌های عصبی و افزایش دسترسی به مقادیر زیادی داده به صورت قابل توجهی بهبود پیدا کرده است.گوگل ترنسلیت - Google Translate خلاصه‌سازی متن یا Text Summarizationهدف از خلاصه‌سازی متن استخراج مهم‌ترین قسمت‌ها و اطلاعات آن به منظور کوتاه کردن طول متن است. این کار باعث ساده‌سازی فرآیند بررسی حجم وسیعی از داده‌ها مانند مقالات علمی، محتوای خبری یا اسناد قانونی می‌شود. دو روش برای خلاصه‌ سازی وجود دارد:۱. خلاصه‌ سازی مبتنی بر استخراج: عبارات کلیدی را استخراج می‌کند و بدون افزودن اطلاعات اضافی یک خلاصه ایجاد می‌کند.۲. خلاصه‌سازی مبتنی بر انتزاع: عبارات جدیدی را با بازنویسی منبع اصلی ایجاد می‌کند.در حال حاضر، رویکرد دوم رایج‌تر است و عملکرد بهتری دارد.تکمیل خودکار یا Autocompleteهر زمان که چیزی را در گوگل جستجو می‌کنیم، پس از تایپ چند حرف، عبارات جستجوی احتمالی را به ما نشان می‌دهد. یا اگر چیزی را با غلط املایی جستجو کنیم، آن‌ها را تصحیح می‌کند (تصحیح خودکار یا Autocorrect) و همچنان نتایج مرتبط را برای ما پیدا می‌کند. این موارد نمونه‌ای از تکمیل خودکار یا autocomplete هستند.تکمیل خودکار جستجو گوگلفیلتر کردن محتوای توهین آمیز یا Abusive Content filteringدر محیط‌هایی مانند شبکه‌های اجتماعی، وب‌سایت‌های خرید و فروش آنلاین و ... که چندین کاربر به یکدیگر متصل می‌شوند و ارتباط برقرار می‌کنند، مبارزه با محتوای توهین آمیز اهمیت زیادی دارد. مواردی مانند زورگویی‌های سایبری، سخنان آزاردهنده و تنفرآمیز، معاملات مجرمانه و ... در این محیط‌ها پیدا می‌شود. امروزه با حجم عظیمی از داده که در این محیط‌ها ارسال می‌شود، انجام این کار توسط نیروی انسانی دشوار به نظر می‌رسد. این‌جاست که پردازش زبان طبیعی برای تسریع فرآیند تشخیص محتواهای توهین‌آمیز وارد عمل می‌شود.آینده پردازش زبان طبیعیبا توجه به افزایش بی‌سابقه حجم اطلاعات در دسترس و پیشرفت در الگوریتم‌های پیچیده و دقیق، محبوبیت پردازش زبان طبیعی یا همان NLP قطعاً افزایش خواهد یافت. کاربردهایی که در این مقاله با یکدیگر بررسی کردیم، گواه این هستند که پردازش زبان طبیعی کیفیت زندگی ما را تا حد قابل توجهی افزایش داده است. در نتیجه با توجه پیشرفت‌های مستمری که روزانه توسط محققان این حوزه‌ی بزرگ صورت می‌گیرد، می‌توانیم انتظار داشته باشیم که در آینده بر جنبه‌های بیشتری از زندگی ما تأثیر بگذارد.همچنین بخوانید:- مقدمه‌ای بر شبکه‌های عصبی بازگشتی (RNNs)- مکانیزم توجه و مدل‌های تبدیل‌کننده (Transformers)منابع:1- Introduction to nlp2- آشنایی با چت بات ها3- Natural language processing4- Natural language processing applications5- Applications of natural language processing NLP6- NLP content moderation overview and use cases</description>
                <category>مجموعه دانش‌بنیان شناسا</category>
                <author>مجموعه دانش‌بنیان شناسا</author>
                <pubDate>Sat, 30 Apr 2022 15:25:13 +0430</pubDate>
            </item>
                    <item>
                <title>مکانیزم توجه و مدل‌های تبدیل‌کننده (Transformers)</title>
                <link>https://virgool.io/@shenasa/%D9%85%DA%A9%D8%A7%D9%86%DB%8C%D8%B2%D9%85-%D8%AA%D9%88%D8%AC%D9%87-%D9%88-%D9%85%D8%AF%D9%84-%D9%87%D8%A7%DB%8C-%D8%AA%D8%A8%D8%AF%DB%8C%D9%84-%DA%A9%D9%86%D9%86%D8%AF%D9%87-transformers-zxboffthj9xi</link>
                <description>مدل‌های تبدیل‌کننده - Transformersاین روزها مدل‌های یادگیری عمیق با سرعت هرچه بیشتری نسبت به قبل معرفی می‌شوند و هر کدام به شکلی تاثیری در پیشرفت این علم دارند؛ اما بی‌شک یکی از تاثیرگذارترین مدل‌هایی که تا کنون معرفی شده، مدل‌های تبدیل‌کننده یا Transformer ها هستند. برای آشنایی بیشتر با این مدل‌ها، در این پست ابتدا روند شکل‌گیری آن‌ها را بررسی کرده و سپس نگاهی به معماری و نحوه‌ی کار آن‌ها می‌اندازیم.با توجه به این که مدل‌های تبدیل‌کننده یا Transformer ها در حل مسائل توالی به توالی (Seq2Seq) کاربرد دارند، بهتر است ابتدا این نوع از مسائل را بررسی کنیم.مدل‌های توالی به توالی (Seq2Seq)همان‌طور که در جلسه‌ی اول مقدمه‌ای بر شبکه‌های عصبی بازگشتی گفته شد، این شبکه‌ها انواع مختلفی دارند. یکی از آن‌ها، شبکه‌های many to many هستند که ابتدا کل رشته‌ی ورودی را پردازش کرده و سپس رشته‌ی خروجی را تولید می‌کنند. برای این کار معمولا از شبکه‌های Encoder-Decoder استفاده می‌شود. شبکه‌ی کدگذار یا Encoder وظیفه دارد که کل رشته‌ی ورودی را پردازش کرده و اطلاعات آن را در وکتوری با ابعاد بالاتر ذخیره کند. در مرحله‌ی بعد، این وکتور به شبکه‌ی کدگشا یا Decoder داده می‌شود تا رشته‌ی خروجی تولید شود.عملکرد مدل‌های توالی به توالیاگر مسئله‌ی مشخصی مانند ترجمه‌ی ماشینی را در نظر بگیریم، این شبکه‌ها در ترجمه‌ی جملات کوتاه عملکرد قابل قبولی دارند؛ اما با توجه به این که وکتور محتوا یا Context Vector طول ثابتی دارد، برای ترجمه‌ی جملات طولانی‌تر به مشکل برمی‌خورند. توجه کنید که مسیری که در این شبکه‌ها برای ترجمه‌ی یک کلمه طی می‌شود بسیار طولانی است.عملکرد کامل مدل‌های توالی به توالیبرای حل این مشکل، تلاش شد تا روشی پیدا شود که برای تولید هر کلمه‌ی خروجی در هر گام زمانی، علاوه بر مفهوم کل جمله، بتوان بخش‌های خاصی از رشته‌ی ورودی را نیز مد نظر داشت. لازم به ذکر است که انسان‌ها نیز برای ترجمه از یک زبان به زبان دیگر روند مشابهی را طی می‌کنند؛ یعنی ابتدا کل جمله را خوانده و مفهوم کلی آن را درمی‌یابند، سپس کلماتی از زبان مبدا را در نظر گرفته و آن‌ها را به زبان مقصد ترجمه می‌کنند. نتیجه‌ی این تلاش، معرفی مکانیزم توجه یا attention بود.مکانیزم توجه - Attentionمکانیزم توجه اولین بار در سال ۲۰۱۵ در مقاله‌ای که توسط Bahdanau نوشته شده بود، برای حل مسئله‌ی ترجمه ماشینی معرفی شد. می‌توان گفت استفاده از مکانیزم توجه به ما کمک می‌کند تا علاوه بر مسئله‌ی اصلی، یک مسئله از نوع  alignment (تعیین این که کدام بخش‌ها از رشته‌ی ورودی به هر خروجی تولیدشده مرتبط هستند) را هم حل کنیم.الگوریتم توجهفرض کنید می‌خواهیم جمله‌ای به طول n را با استفاده از مکانیزم توجه ترجمه کنیم.رشته‌ی ورودی به طول nروش پیشنهادشده توسط Bahdanau دارای مراحل زیر است:۱. کدگذاری کلمات ورودی (Encoding)ابتدا لازم است تا کلمات را به وکتورهای کدگذاری‌شده تبدیل کنیم. Bahdanau برای این کار از یک شبکه‌ی عصبی بازگشتی دوطرفه استفاده کرد و حافظه‌ی نهان یا hidden state آن‌ها را بعد از ورود هر کلمه به هم الحاق کرد. این وکتور‌ها را با h نمایش می‌دهیم.کدگذاری کلمات رشته‌ی ورودی۲. تعیین کلمات مرتبط (Alignment)بعد از کدگذاری کلمات ورودی، نوبت به کدگشایی یا Decoding می‌رسد. برای این کار نیاز است تا هنگام تولید هر کلمه‌ی خروجی، ابتدا مشخص شود که کدام کلمات ورودی اهمیت بیشتری دارند. به بیان دیگر، در این مرحله نیاز به تابعی داریم که با درنظر گرفتن کلماتی که تاکنون تولید شده‌اند و وکتور هر کلمه‌ی ورودی، امتیازی به آن کلمه نسبت دهد. در رابطه زیر، t گام زمانی در تولید کلمات خروجی، a تابع امتیازدهنده، s حافظه‌ی نهان شبکه‌ی Decoder پس از گام زمانی قبلی و e امتیاز نهایی به ازای هر گام زمانی و هر کلمه‌ی ورودی است.امتیازدهی به کلمات رشته‌ی ورودی در هر گام زمانیدر روش Bahdanau، تابع a یک شبکه‌ی عصبی بود که هم‌زمان با شبکه‌های کدگذار و کدگشا آموزش می‌بیند و وزن‌های آن مشخص می‌شود. در سال‌های بعد، روش‌های دیگری برای تعیین میزان ارتباط معرفی شدند، مانند معیار شباهتی کسینوسی یا ضرب داخلی دو بردار.۳. تعیین وزن کلمات (Weighting)برای تبدیل امتیازهای مشخص‌شده به وزن هر کلمه، تابع softmax بر روی آن‌ها اعمال می‌شود.اعمال تابع softmax بر روی امتیازها۴. ایجاد وکتور مخصوص به هر کلمه خروجی (Generate Context Vector)پس از تعیین وزن‌ها، با ضرب هر وزن در کلمه‌ی ورودی مرتبط به آن، وکتور محتوا به ازای هر کلمه‌ی خروجی تولید می‌شود.ایجاد وکتور محتوا به ازای هر گام زمانی۵. تعیین کلمات خروجیشبکه‌ی کدگشا یا decoder که خود یک شبکه‌ی عصبی بازگشتی است، با استفاده از وکتور تولیدشده و حافظه‌ی نهان خود، کلمه‌ی خروجی در گام‌زمانی t ام را تولید می‌کند.برای مرور روند، به ویدئوی زیر از این پست توجه کنید.مکانیزم توجهتوجه به خود - Self-Attentionاین مفهوم برای اولین بار در سال ۲۰۱۶ در این مقاله استفاده شده است. توجه به خود نوع خاصی از دسته‌بندی‌های مکانیزم توجه است که در ادامه‌ی مطلب برای درک بهتر مدل‌های تبدیل‌کننده یا transformer به آن نیاز خواهیم داشت.هدف Self-Attention این است که ارتباط اجزای موجود در یک دنباله را با یکدیگر بسنجد تا بتواند برداشت درست‌تری از کل دنباله داشته باشد. تنها تفاوت این مکانیزم با توجه عادی این است که در توجه به ‌خود، دنباله‌ی ورودی و خروجی یکسانند.در تصویر زیر که از مقاله‌ی گفته‌شده برداشته شده است، ارتباط کلمه قرمز با کلمه‌های قبلی در جمله بررسی شده و شدت آبی بودن هر کلمه، میزان ارتباط را نشان می‌دهد.نمونه‌ای از توجه به خود یا Self-Attentionمدل‌های تبدیل‌کننده - Transformersمدل‌های تبدیل‌کننده یا Transformer ها در سال ۲۰۱۷ در مقاله‌ی «Attention is all you need» معرفی شدند. با معرفی ایده‌ی مدل‌های تبدیل‌کننده، واحدهای بازگشتی حذف شدند تا بتوان مسائل توالی به توالی را تنها با استفاده از مکانیزم توجه حل کرد. در این صورت، این امکان برای ما فراهم می‌شود که اجزای مختلف توالی را به صورت هم‌زمان (parallel) پردازش کنیم. برای درک بهتر این مدل‌ها، در ادامه معماری آن‌ها را بررسی خواهیم کرد.معماری کلیدر شکل زیر می‌توانید معماری کلی شبکه‌های تبدیل‌کننده را مشاهده کنید. با توجه به این که این شبکه در ابتدا برای حل مسئله‌ی ترجمه ماشینی معرفی شد، در ادامه‌ی این مطلب نیز برای درک بهتر فرض می‌کنیم که با همین مسئله مواجه هستیم و می‌خواهیم جمله‌ای از زبان مبدا را به زبان مقصد ترجمه کنیم. حال می‌توانیم به بیان جزئیات بیشتر درباره‌ی هر کدام از بخش‌های ورودی شبکه، کدگذار، کدگشا و طبقه‌بند نهایی بپردازیم.معماری کلی شبکه‌های تبدیل‌کنندهورودی شبکههمان‌طور که می‌دانید، برای این که بتوانیم انواع داده‌های مختلف را در شبکه‌های عصبی پردازش کنیم، باید آن‌ها را به اعداد تبدیل کنیم. از این رو ابتدا نیاز است تا تعبیه یا embedding کلمات جمله در زبان مبدا را به دست آوریم.همان‌طور که قبلا گفته شد، در مدل‌های تبدیل‌کننده واحد بازگشتی نداریم و پردازش کلمات جمله‌ی ورودی می‌تواند به صورت موازی انجام شود. از این رو لازم است تا جایگاه کلمه در جمله (Positional Encoding) نیز به عنوان ورودی به شبکه داده شود. برای این کار، وکتورهای جایگاه با استفاده از روابط زیر محاسبه می‌شوند و به تعبیه یا embedding کلمات اضافه می‌شوند.روابط وکتورهای جایگاهبا توجه به توابع فوق، برای محاسبه positional encoding کلماتی که در جایگاه زوج قرار دارند از تابع سینوس، و برای کلماتی که در جایگاه فرد قرار دارند از کسینوس استفاده می‌شود. می‌توان تصور کرد که استفاده از توابع فوق، مانند این است که اعداد را به فرمت باینری در وکتور ذخیره کنیم، با این تفاوت که محدودیت عدد صحیح بودن را برداشته‌ایم و مجاز به استفاده از اعداد اعشاری نیز هستیم.در نمودار زیر که از این مطلب برداشته شده است، محور افقی طول وکتور و محور عمودی جایگاه‌های مختلف را نشان می‌دهند. به بیان دیگر، هر سطر از این نمودار نشانگر بردار جایگاه به ازای جایگاه‌های متفاوت است. جهت مطالعه بیشتر در این مورد، می‌توانید به همین مطلب مراجعه کنید.وکتورهای جایگاه‌های مختلفبا افزودن وکتورهای جایگاه کلمه به تعبیه یا embedding آن‌ها، به ورودی‌های شبکه کدگذار و کدگشا دست یافته‌ایم. در ادامه عملکرد بخش کدگذار یا Encoder را در شبکه‌های تبدیل‌کننده بررسی خواهیم کرد.کدگذار - Encoderماژول کدگذار (Encoder)هدف شبکه کدگذار یا Encoder درک معنای جمله در زبان مبدا است. همان‌گونه که در شکل فوق مشاهده می‌کنید، این ماژول از دو بخش توجه چندسر یا Multi-head Attention و یک شبکه‌ی پیش‌خور یا Feed Forward تشکیل شده است. در ادامه‌ی مطلب، هر کدام از این المان‌ها را بررسی خواهیم کرد.توجه چندسر (Multi-Head Attention)این نوع از مکانیزم توجه را می‌توان تعمیم‌یافته‌ی نسخه قبلی آن دانست. در توجه چندسر ما با سه موجودیت مختلف به نام کلید (Key)، مقدار (Value) و پرسش (Query) سروکار داریم. در مبحث توجه گفتیم که هدف این کار، تعیین میزان ارتباط بین هر جزء جمله خروجی با تمامی اعضای جمله ورودی است. در نوع تعمیم‌یافته‌ی توجه، کلید و مقدار به ازای هر جزء رشته ورودی و پرسش به ازای اجزای جمله خروجی مشخص می‌شوند. برای درک بهتر، مثال زیر را درنظر بگیرید.فرض کنید در یک سایت پخش فیلم به دنبال فیلم مشخصی هستید. برای پیدا کردن این فیلم عبارت خاصی را در سایت جستجو می‌کنید. این عبارت نقشی مانند query یا پرسش در مکانیزم توجه چندسر دارد. سایت برای پیدا کردن ویدیوی مورد نظر شما، عبارتی که جستجو کرده‌اید را با مواردی مانند عنوان و توضیحات ویدیوهای موجود مقایسه می‌کند و بعد از پیدا کردن شبیه‌ترین عنوان، فیلم مرتبط به آن را برای شما پخش می‌کند. عنوان و توضیحات هر فیلم نقشی مانند کلید یا key و خود فیلم نقشی مانند مقدار یا value در مکانیزم توجه چندسر دارند.اگر به شکل قبل توجه کنید، می‌بینید که هر سه ورودی این بلوک توجه از یک منبع که همان جمله‌ی ورودی است می‌آیند، پس از نوع توجه به خود یا Self Attention است و هدف آن تعیین ارتباط و درک بهتر اجزای جمله‌ی زبان مبدا به یکدیگر است. پیش از بررسی ادامه‌ی روند مدل، لازم است تا الگوریتمی که در این نوع از مکانیزم توجه دنبال می‌شود را بررسی کنیم.توجه مقیاس‌شده‌ی بر پایه‌ی ضرب داخلی (Scaled Dot-Product Attention)در مرحله‌ی اول، وکتور کلمات با گذر از سه لایه‌ی پیش‌خور (feed-forward layer) با وزن‌های متفاوت، وکتورهای K، V و Q  را می‌سازند. سپس این وکتورها، وارد بلوک توجه مقیاس‌شده‌ی بر پایه‌ی ضرب داخلی (Scaled Dot-Product Attention) می‌شوند. در این بخش، ابتدا ضرب داخلی وکتورهای Q و K محاسبه می‌شود تا مشخص شود این دو چقدر به هم شبیهند. سپس، با تقسیم امتیاز حاصل بر جذر طول رشته‌ی ورودی، امتیاز نرمال می‌شود تا از بروز مشکل انفجار گرادیان جلوگیری شود. سپس، با اعمال تابع softmax بر روی این مقادیر، وزن هر کدام از کلیدها برای هر پرسش (query) تعیین می‌شود. در نهایت، وزن‌های محاسبه‌شده در مقدارهای (value) کلمات متفاوت ضرب می‌شوند تا خروجی مورد نظر تولید شود. این مراحل را می‌توانید در تصویر سمت چپ در شکل بالا مشاهده کنید.یادآوریمقدار ضرب داخلی دو بردار با مقادیر یکسان ۱، ضرب داخلی دو بردار عمود ۰ و ضرب داخلی دو بردار خلاف جهت هم -۱ است. از این رو می‌توان از ضرب داخلی دو وکتور به عنوان معیار شباهت آن‌ها استفاده کرد.شاید برایتان سوال شده باشد که چرا این مکانیزم توجه چندسر نام گرفته است. اگر به تصویر سمت راست در شکل بالا نگاه کنید، می‌بینید که تعدادی از بلوک‌ها h بار تکرار شده‌اند. در واقع کلمات به چندین لایه‌ی پیش‌خور و بلوک توجه متفاوت داده می‌شوند که به مجموعه تمامی این‌ها یک سر (head) گفته می‌شود. انتظار می‌رود که هر سر به نکات متفاوتی توجه کند و مسائل متفاوتی را یاد بگیرد، که باعث افزایش قدرت نهایی ماژول کدگذار یا Encoder می‌شود. خروجی این بلوک‌ها به هم الحاق می‌شوند و در نهایت توسط یک لایه‌ی پیش‌خور (feed forward) پردازش می‌شوند.خروجی بلوک توجه چند سر از طریق اتصالات اضافی (residual connection) به وکتورهای کلمات اصلی بعد از مرحله‌ی positional encoding اضافه می‌شوند و در نهایت بر روی حاصل این عملیات یک نرمال‌سازی لایه‌ای اعمال می‌شود.شبکه‌ی پیش‌خورپس از اتمام مراحل قبل، نتیجه برای پردازش بیشتر به یک شبکه‌ی پیش‌خور داده می‌شود که متشکل از چندین لایه‌ با تابع فعال‌ساز ReLU می‌باشد. هم‌چنین، مراحل استفاده از اتصالات اضافی (residual connection) و نرمال‌سازی نیز مجدد تکرار می‌شوند.دو مرحله‌ی اصلی که گفته شد، در کنار هم ماژول کدگذار یا Encoder را در شبکه‌های تبدیل‌کننده ایجاد می‌کنند که هدفش کد کردن ورودی و اطلاعات توجه در وکتوری با مقادیر پیوسته است که به ماژول کدگشا یا decoder کمک می‌کند تا برای تولید هر کلمه‌ی خروجی، به بخش‌های درستی از جمله‌ی ورودی نگاه کند. برای اثربخشی بیشتر، می‌توان این ماژول را چندین مرحله تکرار کرد تا قدرت کدگذاری بیشتری پیدا کند.کدگشا - Decoderهدف ماژول کدگشا یا Decoder تولید جمله‌ی خروجی است. در هر گام زمانی، ماژول از خروجی‌های قبلی کدگذار و کلماتی که در مراحل قبلی تولید شده‌اند استفاده می‌کند تا کلمه‌ی جدیدی تولید کند. این کار تا زمانی ادامه پیدا می‌کند که کلمه‌ی &lt;end&gt; تولید شود که به معنای پایان جمله است.ماژول کدگشا - Decoderالمان‌های تشکیل‌دهنده‌ی این ماژول تقریبا مشابه ماژول کدگذار هستند ولی روند آن تفاوت‌های اندکی دارد. ابتدا تعبیه‌ی (embedding) کلماتی که قبلا تولید شده‌اند استخراج می‌شود و مانند قبل وکتور‌های جایگاه به آن‌ها افزوده می‌شوند. سپس، ماژول کدگشا کار خود را آغاز می‌کند که مراحل آن به شرح زیر هستند.توجه چند سر پوششی (Masked Multi-Head Attention)در گام اول، مانند ماژول کدگذار یا encoder از یک بلوک توجه به خود (self-attention) استفاده می‌شود تا مدل بتواند تحلیل دقیق‌تری از جمله‌ای که تاکنون تولید کرده است داشته باشد؛ اما روند کار آن تفاوت اندکی با دیگر توجه‌های چند سر در شبکه‌های تبدیل‌کننده دارد. با توجه به این که کدگشا یا decoder رشته‌ی خروجی را کلمه به کلمه تولید می‌کند، باید درنظر داشته باشیم که وزن‌های توجه به گونه‌ای نباشند که کلمات به واژه‌های بعد از خود توجه داشته باشند. به بیان دیگر، اگر مثال ابتدای مطلب را درنظر بگیریم، فرض کنید کلمات «گربه»، «موش» و «را» تولید شده‌اند. توجه به خود یا Self-Attention باید درنظر داشته باشد که وزن‌های توجه (attention weights) واژه‌ی «موش» نباید به کلمه‌ی «را» وابسته باشد.برای این کار، در روند توجه مقیاس‌شده‌ی بر پایه‌ی ضرب داخلی (Scaled Dot-Product Attention)، بعد از نرمال شدن امتیازها و قبل از اعمال تابع softmax، آن‌ را با یک ماتریس اکیدا بالا مثلثی که مقادیر بالای قطر اصلی آن منفی بی‌نهایت هستند جمع می‌کنیم. این کار باعث می‌شود که بعد از اعمال تابع softmax، مقدار وزن توجه هر کلمه به کلمه‌های بعد از خودش صفر شود. در شکل سمت چپ تصویر توجه چندسر، واحد Mask با این هدف گذاشته شده است.عملیات پوشاندنتوجه چندسرپس از بلوک توجه به خود، لازم است که برای ترجمه‌ی دقیق‌تر، مدل بخش‌هایی از جمله‌ی ورودی را نیز مورد توجه قرار دهد. از این رو، در بلوک توجه بعدی، کلیدها و مقادیر (Keys &amp; Values) به جای توجه چندسر قبلی، از خروجی ماژول کدگذار یا encoder می‌آیند.شبکه‌ی پیش‌خوردر نهایت، نتیجه‌ی تمامی این مراحل جهت پردازش بیشتر به یک ‌شبکه‌ی پیش‌خور (feed-forward) داده می‌شود. توجه کنید که اتصالات اضافی (residual connection) و نرمال‌سازی لایه‌ها در تمامی این مراحل نیز وجود دارند.ماژول کدگشا یا decoder نیز می‌توانند جهت افزایش قدرت مدل تبدیل‌کننده یا transformer، چندین مرحله تکرار شود. در این صورت، هر ماژول در روند خود از خروجی کدگشای قبلی و نتیجه نهایی ماژول کدگذار یا encoder استفاده می‌کند.چندین ماژول کدگشا و کدگذار طبقه‌بند نهاییپس از از اتمام پردازش‌ها در ماژول کدگشا یا decoder، خروجی به یک لایه‌ی پیش‌خور یا feed-forward با تابع فعال‌ساز softmax داده می‌شود تا کلمه‌ی بعدی از رشته‌ی خروجی را پیش‌بینی کند. تعداد نورون‌های این لایه به اندازه‌ی تعداد کلمات موجود در دایره لغات یا vocabulary مدل است. همان‌طور که قبلا گفته شد، کلمه‌ای که در هر گام زمانی تولید می‌شود به همراه کلمات قبلی مجدد به ماژول کدگشا یا decoder داده می‌شوند که از آن‌ها برای تولید واژه‌ی بعدی استفاده کند. این روند تا زمانی که کلمه &lt;end&gt; (که به معنای پایان جمله است) تولید شود ادامه پیدا می‌کند.با توجه به تاثیرگذاری و اهمیت مدل‌های تبدیل‌کننده یا transformer، در این پست به بررسی معماری و روند کار آن‌ها پرداختیم. هم‌چنین، جهت درک بهتر این مدل‌ها، درباره‌ی مکانیزم توجه و نوع خاصی از آن به نام توجه به خود (Self-Attention) نیز بحث کردیم. مدل‌های تبدیل‌کننده در حوزه‌های مختلفی کاربرد دارند و باعث پیشرفت‌های چشمگیری در بسیاری از مسائل شدند. در پست‌های بعدی، تلاش می‌کنیم تا کاربرد این مدل‌ها را در حوزه‌های مختلف بررسی کنیم.نویسنده: بهار برادران افتخاریمنابع:مقدمه‌ای بر شبکه‌های عصبی بازگشتی (RNNs) - جلسهٔ اول - ویرگولWhat is a Transformer?. An Introduction to Transformers and… | by Maxime | Inside Machine learning | MediumC5W3L07 Attention Model Intuitionhttps://arxiv.org/pdf/1409.0473.pdfHow Does Attention Work in Encoder-Decoder Recurrent Neural NetworksAttention? Attention!The Attention Mechanism from ScratchVisualizing A Neural Machine Translation Model (Mechanics of Seq2seq Models With Attention) – Jay Alammar – Visualizing machine learning one concept at a time.https://arxiv.org/pdf/1601.06733.pdfhttps://arxiv.org/pdf/1706.03762.pdfTransformer Neural Networks - EXPLAINED! (Attention is all you need)Illustrated Guide to Transformers- Step by Step Explanation | by Michael Phi | Towards Data ScienceTransformer Architecture: The Positional Encoding - Amirhossein Kazemnejad&amp;amp;amp;#x27;s BlogWhat exactly are keys, queries, and values in attention mechanisms?The Illustrated Transformer – Jay Alammar</description>
                <category>مجموعه دانش‌بنیان شناسا</category>
                <author>مجموعه دانش‌بنیان شناسا</author>
                <pubDate>Thu, 17 Mar 2022 14:00:28 +0330</pubDate>
            </item>
                    <item>
                <title>تخمین وضعیت سر با استفاده از Mediapipe</title>
                <link>https://virgool.io/@shenasa/%D8%AA%D8%AE%D9%85%DB%8C%D9%86-%D9%88%D8%B6%D8%B9%DB%8C%D8%AA-%D8%B3%D8%B1-%D8%A8%D8%A7-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-mediapipe-jiwmpml2mxag</link>
                <description>تخمین وضعیت سر یا head pose estimation می‌تواند کاربردهای متفاوتی در دنیای بینایی ماشین داشته باشد. به عنوان مثال، می‌توان با بررسی وضعیت سر راننده‌ی خودرو متوجه شد که آیا به جاده نگاه می‌کند یا خیر. هم‌چنین می‌تواند کاربردهای بسیاری در حوزه‌ی واقعیت مجازی (Virtual Reality) نیز داشته باشد. در این مطلب به بیان مفاهیم لازم جهت انجام این کار می‌پردازیم و سپس با استفاده از کتابخانه‌ی Mediapipe، کد این کار را در زبان برنامه‌نویسی پایتون پیاده‌سازی خواهیم کرد.پیش از این که به حل مساله‌ی اصلی بپردازیم، لازم است برخی مفاهیم مقدماتی‌تر را مرور کنیم.مفاهیم مقدماتیکالیبراسیون دوربیندر مسائل کالیبراسیون دوربین تلاش می‌شود تا پارامترهای دوربین به ازای تصاویر گرفته شده توسط آن تخمین زده شود. با استفاده از این پارامترها می‌توان ابعاد واقعی اجسام را از روی تصاویر آ‌ن‌ها پیش‌بینی کرد یا محل قرارگیری دوربین را تشخیص داد.مهم‌ترین پارامترهای دوربین، فاصله کانونی (f) و مرکز نوری (c) آن هستند. با قرار دادن این پارامترها به شکل زیر در ماتریسی 3*3 به ماتریس دوربین دست خواهیم یافت.ماتریس دوربینبا استفاده از جبر خطی و ضرب این ماتریس در مختصات سه‌بعدی اجسام، می‌توان مختصات آن‌ها را در تصویر پیدا کرد.تبدیل مختصات با استفاده از ماتریس دوربینتبدیل‌های فضاییهر نقطه در فضای سه‌بعدی را می‌توان توسط یک بردار سه‌مولفه‌ای جابه‌جا کرد، یا تحت سه زاویه، حول سه محور مختصاتی چرخش داد. برای این کار، از ماتریس‌های تبدیل استفاده می‌شود. با ضرب ماتریس تبدیل در مختصات اولیه نقطه، می‌توان به مختصات آن پس از تبدیل دست یافت.ماتریس تبدیلبه عنوان مثال، ماتریس تبدیل انتقال یا چرخش حول محور X به شکل زیر هستند:نمونه‌هایی از ماتریس تبدیلمی‌توان عملیات انتقال و چرخش حول هر سه محور را هم‌زمان و با یک ضرب ماتریسی به شکل زیر انجام داد.چرخش و انتقال هم‌زماندر ادامه‌ی مطلب، از این نوع تبدیل استفاده خواهیم کرد.مسئله‌ی تخمین وضعیت سرپس از مرور مقدمات، بهتر است که مسئله‌ی اصلی را کمی بیشتر درک کنیم. برای این کار، ابتدا مسئله را از نظر ریاضی بررسی می‌کنیم.دستگاه‌های مختصاتیدر این‌جا ما با سه دستگاه مختصات متفاوت مواجه هستیم که در شکل زیر قابل مشاهده‌اند:دستگاه‌های مختصات مختلف [۱]همان طور که در تصویر فوق مشخص است، سه محور U، V و W دستگاه مختصات اول را می‌سازند که همان دستگاه دنیای واقعی است. دستگاه مختصات دوم متعلق به دوربین است که توسط محورهای X، Y و Z ساخته شده است. این دستگاه با توجه به مکان و زاویه‌ی قرارگیری دوربین، نتیجه‌ی انتقال و چرخش دستگاه مختصات دنیای واقعی تحت تبدیل‌های R و t است. دستگاه مختصات آخر، دستگاه دو بعدی‌ تصویر گرفته‌شده توسط دوربین است که توسط محورهای x و y ساخته شده‌است. نقطه‌ی فرضی P در هر کدام از این دستگاه مختصات متفاوتی دارد.با توجه به موارد گفته شده در بخش قبل، برای به دست آوردن مختصات یک نقطه از دنیای واقعی در تصویر، از فرمول زیر استفاده می‌کنیم:تبدیل مختصات سه‌بعدی به مختصات دوبعدی در تصویرهدف ما پیدا کردن زاویه یا جهت سر در دنیای واقعی است. می‌دانیم که هنگامی که سر خود را به طرفین می‌چرخانیم، در حقیقت دوربین در مکان و جهت ثابتی قرار گرفته است و سر تغییر وضعیت می‌دهد؛ اما می‌توانیم فرض کنیم که سر ثابت است و آنچه که تغییر می‌کند مکان و جهت دوربین نسبت به سر است. در این صورت هدف ما به پیدا کردن R یا تبدیل چرخش دوربین تغییر می‌کند. برای پیدا کردن R، لازم است که مقدار دیگر ماتریس‌های عبارت فوق را به دست آوریم. در ادامه، چگونگی پیدا کردن مقدار مناسب برای هر کدام از آن‌ها توضیح داده می‌شود.ماتریس مختصات سه‌بعدی در دنیای واقعیبا توجه به این که در این مساله قصد داریم تا وضعیت سر را مشخص کنیم، برای پیدا کردن مختصات در دنیای واقعی می‌توانیم از یک مدل فرضی صورت استفاده کنیم و مختصات برخی از نقاط کلیدی چهره را به عنوان ماتریس مختصات در دنیای واقعی استفاده کنیم. توجه داشته باشید که نقاط انتخاب‌شده برای این کار باید در هر سه محور مختصات تغییرات داشته باشند. نقاطی که در این پیاده‌سازی از آن‌ها استفاده می‌شود عبارتند از:نوک بینیگوشه‌ی خارجی چشم راستگوشه‌ی خارجی چشم چپبین دو ابروگوشه‌ی سمت راست لبگوشه‌ی سمت چپ لببرای تخمین این ماتریس، مختصات نقاط فوق در صورت یک شخص حقیقی اندازه‌گیری می‌شوند و به مقیاس پیکسل برده می‌شوند.ماتریس پارامترهای دوربینپارامترهای دوربین ممکن است با توجه به نوع دوربین متفاوت باشند اما می‌توان آن‌ها را با توجه به تصویر خروجی تخمین زد. برای این کار از طول و عرض تصویر برای مقادیر فاصله‌ی کانونی و از مختصات مرکز تصویر برای مقادیر کانون نوری استفاده می‌شود.ماتریس مختصات دوبعدی در تصویربرای مقداردهی این ماتریس لازم است تا مختصات نظیر نقاط مشخص‌شده در دنیای واقعی را در تصویر پیدا کنیم. برای این کار می‌توان از مدل‌هایی که نقاط اساسی چهره (landmarks) را مشخص می‌کنند استفاده کنیم.با مشخص شدن مقادیر تمامی ماتریس‌های فوق، می‌توان بهترین مقدار R و t را با استفاده از بهینه‌سازی لونبرگ-مارکوارت پیدا کرد. برای کسب اطلاعات بیشتر درباره این الگوریتم می‌توانید به صفحه ویکی‌پدیای الگوریتم لونبرگ-مارکوارت رجوع کنید.پیاده‌سازیابتدا کتابخانه‌های مورد نیاز خود را import می‌کنیم.import math

import cv2
import mediapipe as mp
import numpy as npبا توجه به این که برای تشخیص نقاط چهره در تصویر، نیاز به استفاده از مدل‌های تشخیص شبکه‌ی چهره داریم، یک شئ از کلاس FaceMesh در کتابخانه‌ی Mediapipe می‌سازیم.mp_face_mesh = mp.solutions.face_mesh
face_mesh = mp_face_mesh.FaceMesh(min_detection_confidence=0.5, min_tracking_confidence=0.5)هم‌چنین برای تست کد با استفاده از وب‌کم، از VideoCapture در OpenCV استفاده می‌کنیم و فریم‌ها را به ترتیب می‌خوانیم.cap = cv2.VideoCapture(0)
while cap.isOpened():
    success, image = cap.read()برای گرفتن خروجی درست از Mediapipe باید تصویر را از BGR به RGB تبدیل کنیم. پس از فراخوانی تابع و دریافت مختصات نقاط مختلف چهره، مجدد تصویر را به BGR تبدیل می‌کنیم تا به درستی نمایش داده شود.    image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
    results = face_mesh.process(image)
    image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)ماتریس مختصات سه‌بعدی در دنیای واقعی را تعریف می‌کنیم.    face_coordination_in_real_world = np.array([
        [285, 528, 200],
        [285, 371, 152],
        [197, 574, 128],
        [173, 425, 108],
        [360, 574, 128],
        [391, 425, 108]
    ], dtype=np.float64)کتابخانه‌ی Mediapipe مختصات را نسبت به ابعاد تصویر برمی‌گرداند؛ از این رو برای تبدیل آن‌ها به مختصات پیکسلی لازم است که خروجی را در طول و عرض تصویر ضرب کنیم. در قطعه کد زیر، پس از مشخص کردن طول و عرض تصویر، لیست face_coordination_in_image را جهت ذخیره‌ی مختصات دو بعدی نقاط مورد نظر در تصویر چهره تعریف می‌کنیم و مختصات نقاطی را که قبلا گفته شده به آن اضافه می‌کنیم. نقشه‌ی نقاط مختلف در شبکه‌ی حاصل از Mediapipe را می‌توانید از طریق این لینک مشاهده کنید.    h, w, _ = image.shape
    face_coordination_in_image = []
    if results.multi_face_landmarks:
        for face_landmarks in results.multi_face_landmarks:
            for idx, lm in enumerate(face_landmarks.landmark):
                if idx in [1, 9, 57, 130, 287, 359]:
                    x, y = int(lm.x * w), int(lm.y * h)
                    face_coordination_in_image.append([x, y])

            face_coordination_in_image = np.array(face_coordination_in_image, dtype=np.float64)سپس، ماتریس دوربین را بر اساس ابعاد تصویر تخمین می‌زنیم. هم‌چنین ضرایب اعوجاج را با صفر مقداردهی می‌کنیم.            focal_length = 1 * w
            cam_matrix = np.array([[focal_length, 0, w / 2],
                                   [0, focal_length, h / 2],
                                   [0, 0, 1]])
            dist_matrix = np.zeros((4, 1), dtype=np.float64)بعد از مقداردهی اولیه‌ی متغیرها، از تابع solvePnP استفاده می‌کنیم تا وکتورهای چرخش و انتقال را محاسبه کند.            success, rotation_vec, transition_vec = cv2.solvePnP(
                face_coordination_in_real_world, face_coordination_in_image,
                cam_matrix, dist_matrix)خروجی دوم تابع solvePnP، وکتور چرخش است. با استفاده از تابع Rodrigues این وکتور را به ماتریس چرخش تبدیل می‌کنیم.            rotation_matrix, jacobian = cv2.Rodrigues(rotation_vec)برای اطلاعات بیشتر:وکتور چرخش یا Rotation vector در اصل یک وکتور چهارتایی است که سه مولفه‌ی آن، محوری را که چرخش حول آن اتفاق می‌افتد توصیف می‌کنند و مولفه چهارم، زاویه‌ی چرخش است. در OpenCV از شکل فشرده‌ی این وکتور استفاده شده است که سه مولفه دارد و قابل تبدیل به شکل قبلی است. برای کسب اطلاعات بیشتر درباره‌ی چگونگی این کار می‌توانید این لینک را مشاهده کنید.با توجه به شکل ماتریس چرخش R که در بخش‌های ابتدایی دیدیم، برای پیدا کردن سه زاویه‌ی چرخش حول محورها می‌توانیم از تابع زیر استفاده کنیم. توجه کنید که زاویه‌های گفته شده در ماتریس R برحسب رادیان هستند و این تابع پس از محاسبه مقدار هر کدام، آن‌ها را به درجه تبدیل می‌کند.def rotation_matrix_to_angles(rotation_matrix):
    x = math.atan2(rotation_matrix[2, 1], rotation_matrix[2, 2])
    y = math.atan2(-rotation_matrix[2, 0], math.sqrt(rotation_matrix[0, 0] ** 2 +
                                                     rotation_matrix[1, 0] ** 2))
    z = math.atan2(rotation_matrix[1, 0], rotation_matrix[0, 0])
    return np.array([x, y, z]) * 180. / math.piدر پایان با فراخوانی تابع فوق، زاویه‌ی سر را نسبت به سه محور مختصات به دست می‌آوریم و بر روی تصویر نمایش می‌دهیم.            yaw, pitch, roll = rotation_matrix_to_angles(rotation_matrix)
            text = f&#039;{int(pitch)} | {int(yaw)} | {int(roll)}&#039;
            cv2.putText(image, text, (20, 20), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)
    cv2.imshow(&#039;Head Pose Angles&#039;, image)

    if cv2.waitKey(5) &amp; 0xFF == 27:
        breakدر این مطلب ابتدا با مسائل مقدماتی کالیبراسیون دوربین و تبدیل مختصات آشنا شدیم. سپس با بررسی دقیق‌تر مسئله‌ی تخمین وضعیت سر آن را از نظر ریاضیاتی به صورت دقیق‌تر تعریف کردیم و در نهایت به پیاده‌سازی مرحله به مرحله کد آن در زبان برنامه‌نویسی پایتون و با استفاده از کتابخانه‌ی Mediapipe پرداختیم. جهت مشاهده‌ی کد کامل می‌توانید به گیت‌هاب شناسا مراجعه کنید. نویسنده: بهار برادران افتخاریمنابع:https://learnopencv.com/head-pose-estimation-using-opencv-and-dlib/https://medium.com/analytics-vidhya/real-time-head-pose-estimation-with-opencv-and-dlib-e8dc10d62078https://towardsdatascience.com/camera-calibration-fda5beb373c3http://www.cs.cmu.edu/~16385/s17/Slides/11.1_Camera_matrix.pdfhttps://github.com/google/mediapipehttps://docs.opencv.org/3.4/d9/d0c/group__calib3d.html</description>
                <category>مجموعه دانش‌بنیان شناسا</category>
                <author>مجموعه دانش‌بنیان شناسا</author>
                <pubDate>Tue, 25 Jan 2022 12:19:16 +0330</pubDate>
            </item>
                    <item>
                <title>سوگیری‌های انسانی و تاثیر آن‌ها بر مدل‌های هوش مصنوعی</title>
                <link>https://virgool.io/@shenasa/%D8%B3%D9%88%DA%AF%DB%8C%D8%B1%DB%8C-%D9%87%D8%A7%DB%8C-%D8%A7%D9%86%D8%B3%D8%A7%D9%86%DB%8C-%D9%88-%D8%AA%D8%A7%D8%AB%DB%8C%D8%B1-%D8%A2%D9%86-%D9%87%D8%A7-%D8%A8%D8%B1-%D9%85%D8%AF%D9%84-%D9%87%D8%A7%DB%8C-%D9%87%D9%88%D8%B4-%D9%85%D8%B5%D9%86%D9%88%D8%B9%DB%8C-frivfgpztlcb</link>
                <description>تصور بسیاری از مردم این است که هنگام تصمیم‌گیری درباره‌ی موضوعات مختلف، بر اساس استدلال‌های منطقی عمل می‌کنند؛ اما در حقیقت ذهن تمام انسان‌ها، بسته به شرایط مختلف، تحت تاثیر سوگیری‌هایی است که به شدت بر روی اقدامات آن‌ها تاثیر می‌گذارد. این سوگیری‌ها در واقع یک تصور قوی و از پیش‌ ساخته‌شده از کسی یا چیزی هستند که به واسطه‌ی اطلاعاتی که «داریم» یا «نداریم» شکل گرفته‌اند.سوگیری‌های شناختی (Cognitive Bias) افکار و اعتقادات ما را دچار اختلال می‌کنند و در نهایت منجر به اشتباهات سیستماتیک در پردازش و تفسیر ما از اطلاعات مختلف در جهان پیرامون می‌شود. گاهی اوقات این سوگیری‌ها به شکل نسبتا واضحی خودشان را نشان می‌دهند و یک شخص می‌تواند به راحتی این گرایشات را در خود یا دیگران مشاهده کند؛ اما در موارد دیگری به شکل نامحسوس بر روی افکار ما تاثیر می‌گذارند و نمی‌توان به سادگی متوجه آن‌ها شد.چرا سوگیری در افکار ما رخ می‌دهد؟انسان‌ها در هنگام مواجهه با یک مسئله جدید، امکان ارزیابی تمام جزئیات ممکن را ندارند. اگر فرد بخواهد قبل از تصمیم‌گیری درباره‌ی یک موضوع خاص، تمام گزینه‌های موجود را به دقت بررسی کند، تصمیم‌گیری درباره‌ی یک موضوع ساده و پیش پا افتاده نیز به شدت زمان‌بر و طاقت‌فرسا خواهد بود. به دلیل پیچیدگی‌های جهان پیرامون ما و همچنین انبوه اطلاعاتی که روزانه ما را بمباران می‌کنند، منطقی به نظر می‌رسد که فرد با تکیه بر میانبرهای ذهنی خود تصمیم بگیرد.تکیه بر میانبرهای ذهنی منجر به شکل‌گیری سوگیری در افراد می‌شود؛ زیرا برخی از تعصبات که در ذهن انسان نهادینه شده‌اند، باعث انحراف از تصمیم یا قضاوت صحیح می‌گردند. علاوه بر این ممکن است عوامل دیگری نیز در شکل‌گیری سوگیری تاثیرگذار باشد؛ به عنوان مثال احساسات، انگیزه‌های فردی، محدودیت در توانایی ذهن برای پردازش اطلاعات و فشارهای اجتماعی عوامل دیگری هستند که باعث شکل‌گیری سوگیری می‌شوند.ارتباط سوگیری با هوش مصنوعیسوگیری شناختی یک مسئله‌ی روان‌شناختی است که سال‌ها توسط محققان مختلف مورد مطالعه قرار گرفته است. طی سال‌های اخیر، بسیاری از جوامع در حال بررسی این موضوع هستند که چه مقدار از این سوگیری‌ها و تعصبات انسانی وارد سیستم‌های هوش مصنوعی شده‌اند. با توجه به این که بسیاری از شرکت‌ها در حال استفاده از راهکارهای مبتنی بر هوش مصنوعی به منظور ارتقاء کیفیت خدماتشان هستند، آگاهی عمیق از این تهدیدها و تلاش برای به حداقل رساندن آن‌ها می‌تواند بسیار مفید باشد.سوال اساسی که مطرح می‌شود این است که، علت اصلی معرفی سوگیری در سیستم‌های هوش مصنوعی چیست و چگونه می‌توان از آن جلوگیری کرد؟ در موارد متعددی، سوگیری‌ها می‌توانند به الگوریتم‌های هوش مصنوعی نفوذ کنند. سیستم‌های هوش مصنوعی با داده‌هایی آموزش داده می‌شوند که تصمیمات انسانی در آن‌ها دخیل است. اگر مواردی همچون جنسیت، قومیت، نابرابری‌های تاریخی و اجتماعی که از سوگیری ذهن انسان‌ها نشئت می‌گیرد در این داده‌ها وجود داشته باشد، الگوریتم‌های سیستم‌های هوش مصنوعی نیز به تبع آن دچار این سوگیری‌ها خواهند شد.سوگیری در هوش مصنوعی از کجا سرچشمه می گیرد؟ما اغلب شنیده‌ایم که کامپیوترها بی‌طرف هستند؛ اما متأسفانه این طور نیست. در مورد انسان‌ها شیوه‌ی تربیتی، تجربه‌ها و فرهنگی که در آن رشد کرده‌اند، مفروضات آن‌ها را درباره‌ی دنیای اطرافشان شکل می‌دهد. این موضوع برای سیستم‌های هوش مصنوعی نیز صادق است.سوگیری در هوش مصنوعی می‌تواند از روشی که داده‌های آموزشی جمع‌آوری و پردازش می‌شود ناشی می‌شود. اشتباهاتی که دانشمندان داده ممکن است مرتکب شوند، شامل حذف مطالب ارزشمند، برچسب زدن متناقض داده‌ها و نمونه‌برداری نامتوازن (بیش از حد کم یا زیاد) می‌باشد. برای مثال، نمونه‌برداری کم می‌تواند باعث ایجاد انحراف در توزیع کلاس‌ها شود و باعث شود مدل‌های هوش مصنوعی کلاس‌های اقلیت را به طور کامل نادیده بگیرند. در مقابل، نمونه‌برداری بیش از حد، به نوبه خود ممکن است منجر به نمایش بیش از حد گروه‌ها یا عوامل خاص در مجموعه‌ی داده‌های آموزشی شود. به عنوان مثال، جرایم ارتکابی در مکان‌هایی که پلیس به آنها رفت و آمد می‌کند، به احتمال زیاد در مجموعه داده‌های آموزشی ثبت می‌شوند، صرفاً به این دلیل که گشت پلیس در آنجاست. در نتیجه، الگوریتم‌های آموزش داده شده بر روی چنین داده‌هایی احتمالاً منعکس‌کننده‌ی این عدم تناسب هستند.یک منبع دیگر سوگیری هوش مصنوعی، بازخورد کاربران دنیای واقعی در تعامل با مدل‌های هوش مصنوعی است. افراد ممکن است بدون این که متوجه باشند، سوگیری را که در مدل‌های هوش مصنوعی از قبل مستقر شده است، تقویت کنند. به عنوان مثال، یک شرکت کارت اعتباری ممکن است از الگوریتم هوش مصنوعی‌ای استفاده کند که دارای سوگیری اجتماعی در تبلیغ محصولاتشان است و افراد کم سواد را با پیشنهادهایی با نرخ بهره بالاتر هدف قرار می‌دهد. این افراد ممکن است روی این نوع تبلیغات کلیک کنند، بدون این که بدانند به سایر گروه‌های اجتماعی پیشنهادات بهتری نشان داده می‌شود. این اقدام باعث می‌شود سوگیری موجود در این سیستم افزایش یابد.برای این که درک صحیحی از تاثیر سوگیری در عملکرد سیستم‌های مبتنی بر هوش مصنوعی داشته باشیم، بهتر است در ابتدا انواع سوگیری در رفتار انسان‌ها را به درستی بشناسیم. این سوگیری‌ها با تاثیر در روند جمع‌آوری داده می‌توانند به مدل‌های هوش مصنوعی نیز منتقل شوند. در ادامه به معرفی انواع سوگیری در رفتار انسان‌ها می‌پردازیم و پس از آن به بررسی چند نمونه از این سوگیری‌ها در هوش مصنوعی می‌پردازیم.انواع سوگیریسوگیری گزارش‌دهی (Reporting Bias)سوگیری گزارش‌دهی که همچنین به عنوان گزارش‌دهی انتخابی (selective reporting) نیز شناخته می‌شود، زمانی اتفاق می‌افتد که تنها بخشی از نتایج به صورت گزینشی در یک مجموعه داده جمع‌آوری می‌شوند. بنابراین، نتایج جمع‌آوری شده تنها بخشی از کل داده‌های دنیای واقعی را پوشش می‌دهد. به عنوان مثال، بر اساس داده‌های موجود انتظار می‌رود که انسان‌ها بیشتر بخندند تا پلک بزنند، چون پلک زدن معمولا در گزارش‌ها آورده نمی‌شود. برخی از انواع سوگیری‌های گزارش‌دهی به شرح زیر است:سوگیری استنادی (Citation Bias): زمانی اتفاق می‌افتد که تحلیل شما بر اساس مطالعاتی است که در استنادات سایر مطالعات وجود دارد.سوگیری زبانی (Language Bias): زمانی 	اتفاق می‌افتد که فرد گزارش‌ها یا داده‌هایی را که به زبان مادری‌اش منتشر نشده‌اند نادیده می‌گیرد.سوگیری انتشار تکراری (Duplicate Publication Bias): زمانی اتفاق می‌افتد که برخی از مطالعات یا داده‌ها وزن بیشتری دارند زیرا در بیش از یک مکان منتشر شده‌اند.سوگیری مکانی (Location Bias): زمانی رخ می‌دهد که یافتن برخی از داده‌ها دشوارتر از سایرین باشد.سوگیری انتشار (Publication Bias): زمانی اتفاق می‌افتد که احتمال انتشار مطالعاتی با یافته‌های مثبت بیشتر از مطالعاتی است که یافته‌های منفی دارند یا یافته‌های مهمی ندارند.سوگیری گزارش نتیجه (Outcome Reporting Bias): زمانی اتفاق می‌افتد که گزارش‌های انتخابی از نتایج خاص وجود داشته باشد. برای مثال شما فقط زمانی گزارش می‌دهید که شرکت درآمدهای مثبت را در گزارش سه‌ماهه منتشر کند.سوگیری تاخیر زمانی (Time lag bias): زمانی اتفاق می‌افتد که انتشار برخی از مطالعات یا داده‌ها سال‌ها طول می‌کشد.سوگیری خودکارسازی (Automation Bias)سوگیری خودکارسازی به تمایل بیش از اندازه افراد به واگذاری تصمیمات خود به سامانه‌های خودکار و نادیده گرفتن اطلاعات متناقض ارائه‌شده توسط سیستم‌های غیرخودکار، حتی اگر درست باشند، گفته می‌شود. این نوع سوگیری می‌تواند به بی‌دقتی در نظارت و تصمیم‌گیری منجر شود.سوگیری خودکارسازی معمولاً در جاهایی دیده می‌شود که سامانه بیشتر به صورت خودکار اداره می‌شود و افراد تنها نقش ناظر را بر عهده دارند. این سوگیری ممکن است در برخورد با هر زمینه‌ای، مانند کنترل یک نیروگاه هسته‌ای، خلبان خودکار، یا حتی یک غلط‌یاب رایانه‌ای دیده شود.خطاهای ناشی از سوگیری خودکارسازی می‌تواند به صورت از قلم‌ افتادن عملی که باید انجام شود (در مواقعی که سامانه خودکار آن را شناسایی نکرده است) یا به اشتباه افتادن افراد به دلیل پیشنهاد یا تصمیم اشتباه سامانه ظاهر شود.سوگیری انتخابی (Selection Bias)سوگیری انتخابی زمانی اتفاق می‌افتد که داده‌ها به گونه‌ای انتخاب شوند که منعکس‌کننده‌ی توزیع داده‌های دنیای واقعی نیستند. دلیل این اتفاق این است که هنگام جمع‌آوری داده‌ها، تصادفی‌سازی (randomization) مناسب حاصل نشده است. برخی از انواع سوگیری انتخابی به شرح زیر است:سوگیری نمونه‌گیری (Sampling Bias): زمانی اتفاق می‌افتد که تصادفی‌سازی به درستی در طول جمع‌آوری داده‌ها به دست نیاید.سوگیری همگرایی (Convergence bias): زمانی اتفاق می‌افتد که داده‌های جمع‌آوری‌شده را نتوان به عنوان نماینده‌ای از کل داده‌ها در نظر گرفت. به عنوان مثال، وقتی داده‌ها را فقط با نظرسنجی از مشتریانی که محصول شما را خریداری کرده‌اند جمع‌آوری کنید، مجموعه‌ی داده‌های شما گروهی از افراد را که محصول شما را خریداری نکرده‌اند شامل نمی‌شود.سوگیری مشارکت (Participation bias): زمانی اتفاق می‌افتد که داده‌ها به دلیل عدم مشارکت برخی از افراد در فرآیند جمع‌آوری داده‌ها، ناقص هستند.به عنوان مثال فرض کنید شرکت اپل و سامسونگ در یک روز محصول جدیدشان را عرضه می‌کنند. شما برای ۱۰۰۰ نفر یک فرم نظرسنجی ارسال می‌کنید تا نظرات آن‌ها را جمع آوری کنید. اگر به جای انتخاب تصادفی پاسخ‌ها تصمیم بگیرید که فقط ۱۰۰ مشتری اولی را که در نظرسنجی شرکت کرده‌اند انتخاب کنید، منجر به سوگیری نمونه‌گیری می‌شود؛ زیرا آن ۱۰۰ مشتری به احتمال زیاد نسبت به محصول مشتاق‌تر هستند و نظرات خوبی ارائه می‌دهند.در مرحله بعد، اگر تصمیم بگیرید داده‌ها را تنها از طریق نظرسنجی از مشتریان اپل جمع‌آوری کنید، یک سوگیری همگرایی در مجموعه داده ایجاد می‌شود.در نهایت فرض کنید شما نظرسنجی را برای ۵۰۰ مشتری اپل و ۵۰۰ مشتری سامسونگ ارسال کرده‌اید و از بین آن‌ها، ۴۰۰ مشتری اپل و تنها ۱۰۰ مشتری سامسونگ پاسخ می‌دهند. اکنون، این مجموعه داده، نظر مشتریان سامسونگ را کمتر نشان می‌دهد و دارای سوگیری مشارکت است.سوگیری تعمیم افراطی (Overgeneralization Bias)سوگیری تعمیم افراطی یک شیوه‌ی تفکر تحریف شده است که منجر به برخی خطاهای بسیار مهم در تفکر می‌شود. این سوگیری زمانی اتفاق می‌افتد که فرض کنید آنچه در مجموعه‌ی داده‌ی خود می‌بینید، همان چیزی است که در هر مجموعه‌ی داده‌ی دیگری که برای ارزیابی همان اطلاعات است، بدون توجه به اندازه آن، مشاهده خواهید کرد. این سوگیری در مرحله تحلیل نتایج آموزش مدل ممکن است باعث خطا شود.سوگیری ضمنی (Implicit Bias)سوگیری ضمنی زمانی اتفاق می‌افتد که مفروضاتی بر اساس تجربیات شخصی خود فرد ساخته می‌شوند که لزوماً کاربرد کلی‌تری ندارند. به عنوان مثال یک مهندس بینایی کامپیوتر از آمریکای شمالی رنگ قرمز را به عنوان خطر درنظر می‌گیرد؛ درحالی‌که، همان رنگ قرمز یک رنگ محبوب در فرهنگ چینی است که نماد شانس، شادی و خوشبختی است.یکی از مهم‌ترین انواع سوگیری ضمنی، سوگیری تاییدی یا Confirmation Bias است. سوگیری تاییدی گرایش به جستجو در اطلاعات یا تعبیر کردن آن به نحوی است که باورها یا فرضیه‌های خود شخص را تایید کند. به دنبال پیروی از این سوگیری، شخص تنها جنبه‌هایی از موضوع را می‌بیند که متناسب با تعصباتش است و از مواردی که مغایر با باورهایش است، اجتناب می‌کند.مصداق سوگیری تاییدی به مثابه ضرب‌المثل «مثل کبک سرش را زیر برف فرو کرده است» می‌باشد که برای افرادی به کار می‌رود که عمداً چشمشان را به روی واقعیت‌ها می‌بندند. مثال‌های دیگری که برای سوگیری تاییدی می‌توان بیان کرد، عبارت است از:شخصی که تنها به اطلاعاتی توجه می‌کند که در راستای تایید اعتقاداتش درباره گرمایش زمین است.شخصی که در شبکه‌های اجتماعی تنها افرادی را دنبال می‌کند که با او دیدگاه‌های مشترکی دارند.شخصی که تنها پایگاه‌های خبری را بررسی می‌کند که خبرهایی هم‌سو با ذائقه سیاسی‌اش را منتشر می‌کند.مشکل این نوع سوگیری این است که ممکن است باعث انتخاب‌های ضعیف یا ناتوانی در گوش دادن به نظرات مخالف شود. در آموزش مدل‌های هوش مصنوعی، توسعه‌دهندگان ممکن است ناخواسته در روند جمع‌‌آوری یا برچسب زدن داده‌ها به شکلی عمل کنند که سیستم به خروجی‌ای مطابق با باورهای آنان دست پیدا کند. این کار باعث می‌شود تا سوگیری تاییدی به مدل آموزش‌دیده نیز منتقل شود. هم‌چنین ممکن است محققان در تحلیل نتایج مدل‌های هوش مصنوعی دچار این سوگیری شوند.سوگیری پَس‌نگری (Hindsight Bias)پس‌نگری نوعی سوگیری شناختی است که ذهن پس از این که چیزی اتفاق می‌افتد گمان می‌کند از اول از آن خبر داشته است. فردی که با پس‌نگری قضاوت می‌کند پس از این که رویدادی اتفاق می‌افتد با گفتن جملاتی شبیه «ته ذهنم از اول مطمئن بودم» یا «الآن که فکر می‌کنم از اول می‌دانستم چنین خواهد شد» القا می‌کند که آن رویداد قابل پیش‌بینی بوده، در حالی که در واقعیت شواهد اندکی برای پیش‌بینی وجود داشته است.تعدادی از مثال‌های سوگیری پس‌نگری عبارت است از:اصرار بر این که می‌دانستید چه تیمی قرار است یک بازی فوتبال را برنده شود.باور داشتن به این که در تمام مدت می‌دانستید که کدام نامزد سیاسی قرار است در انتخابات پیروز شود.بررسی یکی از امتحانات گذشته و فکر کردن به این که جواب سوالاتی را که از دست داده‌اید می‌دانستید.باور به این که می‌توانستید پیش‌بینی کنید کدام سهام سودآور می‌شود.در یک آزمایش روانشناسی کلاسیک، از دانش‌آموزان یک کالج خواسته شد پیش‌بینی کنند که آیا کلارنس توماس (یکی از نامزدهای انتخابات مجلس سنا آمریکا) می‌تواند به مجلس راه پیدا کند یا خیر. قبل از انتخابات سنا، ۵۸ درصد از دانش‌آموزان فکر می‌کردند که توماس رای خواهد آورد. پس از انتخاب شدن توماس، از دانش‌آموزان مجدداً نظرسنجی شد و این بار ۷۸ درصد از دانش‌آموزان گفتند که معتقد بودند توماس رای می‌آورد.سوگیری پس‌نگری به دلایل مختلفی رخ می‌دهد، از جمله ناتوانایی ما در به یادآوردن پیش‌بینی‌های قبلی، تمایل ما به تلقی رویدادها به عنوان موارد اجتناب‌ناپذیر، و تمایل ما به این باور که می‌توانستیم رویدادهای خاصی را پیش‌بینی کرده باشیم. این سوگیری در مرحله تحلیل نتایج می‌تواند باعث شود که ما انتظاراتی غیر واقعی از مدل‌های هوش مصنوعی داشته باشیم.سوگیری لنگر انداختن (Anchoring Bias)لنگر انداختن نوعی سوگیری شناختی است که طی آن ذهن در فرآیند تصمیم‌گیری به نخستین اطلاعاتی که به دست می‌آورد تکیه می‌کند. ذهن روی اطلاعات اولیه یا قسمتی از آن گیر می‌افتد و زحمت جستجوی بیشتر را به خود نمی‌دهد. به عنوان مثال اولین رقمی که در یک حراجی برای فروش یک اثر هنری بیان می‌شود، معمولا به یک نقطه لنگرگاه تبدیل می‌شود و قیمت‌های پیشنهادی بعدی مبتنی بر آن است و یا پزشکان می توانند در هنگام معاینه بیماران مستعد سوگیری لنگر شوند. اولین برداشت‌های پزشک از بیمار اغلب یک نقطه لنگر ایجاد می‌کند که گاهی اوقات می‌تواند به اشتباه بر تمام ارزیابی‌های تشخیصی بعدی تأثیر بگذارد.همانند سایر سوگیری‌های شناختی، سوگیری لنگر انداختن تصمیم‌گیری‌های روزمره ما را تحت تاثیر قرار می‌دهد. افرادی که دچار این سوگیری هستند نمی‌توانند کلیه فاکتورهای ممکن را مورد بررسی قرار دهند که این امر منجر به تصمیم‌گیری اشتباه می‌شود.در کار با مدل‌های هوش مصنوعی، این سوگیری می‌تواند باعث تحلیل اشتباه خطاهای مدل شود.سوگیری راه‌حل دمِ‌دست (Availability Heuristic)سوگیری راه‌حل دم‌دست نوعی سوگیری شناختی است که تحت تاثیر آن، افراد تمایل دارند اطلاعات تازه‌تر و دردسترس‌تر را اساس قضاوت قرار دهند. مثلا فرد بعد از شنیدن اخبار مختلف درباره سرقت چندین خودرو در محله‌ای که زندگی می‌کند، ممکن است این‌گونه تصور کند که جرم و جنایت در کل شهر افزایش پیدا کرده است. مثال دیگری که برای این سوگیری می‌توان بیان کرد، اخبار مربوط به سقوط هواپیماست. برخی افراد وقتی خبرهای مربوط به سقوط هواپیما و تعداد کشته‌های ناشی از آن سانحه را می‌شنوند، از ترس سقوط هواپیما ممکن است تا مدت‌ها از سفر هوایی خودداری کنند و ترجیح دهند با خودرو شخصی سفر کنند، درحالی‌که آمار سوانح جاده‌ای به مراتب بیشتر از سوانح هوایی است.همان‌طور که از این مثال‌ها مشخص است، راه حل دم‌دست، احتمال وقوع هر رویداد را بر اساس در دسترس بودن اطلاعات مربوط به آن واقعه در حافظه حدس می‌زند. درنتیجه افراد به اطلاعاتی که در دسترس است بیش از حد اعتماد می‌کنند. این سوگیری می‌تواند محققان را در تحلیل مدل گمراه کند.مثال‌هایی از سوگیری در هوش مصنوعیسوگیری جنسیتی در سیستم استخدام خودکار آمازونآمازون با هدف خودکارسازی فرآیند استخدام، یک پروژه هوش مصنوعی را در سال 2014 آغاز کرد. پروژه آنها صرفاً به بررسی رزومه متقاضیان و رتبه‌بندی آنها با استفاده از الگوریتم‌های هوش مصنوعی می‌پرداخت تا از این طریق کارمندان بخش منابع انسانی وقت خود را صرف بررسی دستی رزومه افراد نکنند. با این حال، در سال 2015 آمازون متوجه شد که سیستم جدید استخدام آن‌ها به طور منصفانه متقاضیان را رتبه‌بندی نمی‌کند و دارای سوگیری علیه زنان است.آمازون از داده‌های تاریخی 10 سال گذشته برای آموزش مدل هوش مصنوعی خود استفاده کرده بود. داده‌های تاریخی حاوی سوگیری‌هایی علیه زنان بود. زیرا در آن بازه زمانی مردان بیشتری نسبت به زنان در این حوزه فعالیت می‌کردند. از نظر آماری مردان 60 درصد از کارکنان آمازون را تشکیل می‌دادند. بنابراین سیستم استخدام آمازون به اشتباه آموزش دیده بود که متقاضیان مرد ارجحیت دارند و رزومه‌های زنان را رد می‌کرد. در نهایت آمازون استفاده از این الگوریتم را برای اهداف استخدامی متوقف کرد.سوگیری نژادی در الگوریتم مراقبت‌های بهداشتیدر ایالات متحده الگوریتمی جهت پیش‌بینی اینکه چه بیمارانی احتمالاً به مراقبت‌های پزشکی اضافی نیاز دارند طراحی شده بود. این الگوریتم بر روی بیش از 200 میلیون از شهروندان ایالات متحده استفاده شد و مشخص شد که دارای سوگیری نژادی است. نتایجی که این الگوریتم تولید می‌کرد به نفع افراد سفیدپوست بود و بر علیه سیاه‌پوستان سوگیری داشت.طراحان این الگوریتم از هزینه‌های مراقبت‌های بهداشتی بیماران قبلی به عنوان داده‌های آموزشی استفاده کرده بودند. استفاده از این داده‌ها، تفسیر غلطی را در سیستم هوش مصنوعی ایجاد کرده بود؛ زیرا درآمد و نژاد معیارهایی با همبستگی بالایی هستند و فرضیات مبتنی بر تنها یک متغیر از معیارهای همبسته باعث شد الگوریتم نتایج نادرستی ارائه دهد.سوگیری نژادی در نرم‌افزار جرم‌شناسیالگوریتم COMPAS به منظور پیش‌بینی احتمال وقوع مجدد جرم در سیستم‌های دادگاه ایالتی در سراسر ایالات متحده استفاده می‌شود. این نرم‌افزار در هنگام محکومیت مجرمان به عنوان یک راهنما عمل می‌کند و احتمال وقوع جرم توسط آن‌ها را پیش‌بینی می‌کند. پس از بررسی نتایج بدست آمده از این نرم‌افزار مشخص شد که دارای سوگیری بر علیه سیاه‌پوستان است. نتایج آماری که الگوریتم تولید می‌کند بیانگر آن است که متهمان سیاه‌پوست احتمال بیشتری دارد که مجددا مرتکب به جرم شوند و این در حالی است که این میزان برای متهمان سفید‌پوست کمتر است.سوگیری در الگوریتم تبلیغاتی فیسبوکدر سال ۲۰۱۹ مشخص شد که فیس‌بوک برخلاف قانون اساسی ایالات متحده، به تبلیغ‌کنندگان خود اجازه می‌دهد تا عمداً تبلیغات را بر اساس جنسیت، نژاد و مذهب هدف قرار دهند. درنتیجه آگهی‌های شغلی مربوط به پرستاری یا منشی عمدتاً به زنان پیشنهاد می‌شد، در حالی که آگهی‌های شغلی برای سرایداری و رانندگان تاکسی به تعداد بیشتری از مردان، به‌ویژه مردانی که در طبقه اقلیت قرار داشتند، نشان داده می‌شد. در نهایت به دلیل این دستکاری‌های انجام شده در نتایج، الگوریتم به‌گونه‌ای آموزش دید‌ که آگهی‌های املاک و مستغلات وقتی به افراد سفیدپوست نشان داده می‌شوند احتمالاً به آمار تعامل بهتری می‌رسند و در نتیجه دیگر به سایر گروه‌های اقلیت نشان داده نمی‌شد.همین‌طور که مشاهده کردید، سوگیری‌های انسانی می‌توانند به شکل‌های مختلف عملکرد مدل‌های هوش مصنوعی را تحت تاثیر قرار دهند. از این رو، محققان در تلاشند تا با شناخت انواع سوگیری‌ها و آگاهی به آن‌ها، تاثیرگذاری سوگیری‌ها را کم کنند.نویسنده: بنیامین زارعیمنابع:https://www.masterclass.com/articles/how-to-identify-biashttps://www.verywellmind.com/cognitive-biases-distort-thinking-2794763https://www.lexalytics.com/lexablog/bias-in-ai-machine-learninghttps://itrexgroup.com/blog/ai-bias-definition-types-examples-debiasing-strategies/#https://towardsdatascience.com/real-life-examples-of-discriminating-artificial-intelligence-cae395a90070https://www.logically.ai/articles/5-examples-of-biased-aihttps://towardsdatascience.com/types-of-biases-in-data-cafc4f2634fbhttps://www.mlglossary.ir/</description>
                <category>مجموعه دانش‌بنیان شناسا</category>
                <author>مجموعه دانش‌بنیان شناسا</author>
                <pubDate>Sun, 26 Dec 2021 13:14:40 +0330</pubDate>
            </item>
                    <item>
                <title>مقدمه‌ای بر شبکه‌های عصبی بازگشتی - جلسهٔ چهارم</title>
                <link>https://virgool.io/@shenasa/%D9%85%D9%82%D8%AF%D9%85%D9%87-%D8%A7%DB%8C-%D8%A8%D8%B1-%D8%B4%D8%A8%DA%A9%D9%87-%D9%87%D8%A7%DB%8C-%D8%B9%D8%B5%D8%A8%DB%8C-%D8%A8%D8%A7%D8%B2%DA%AF%D8%B4%D8%AA%DB%8C-%D8%AC%D9%84%D8%B3%D9%87%D9%94-%DA%86%D9%87%D8%A7%D8%B1%D9%85-nevims3a4xwe</link>
                <description>در جلسه‌ی چهارم از دوره‌ی «مقدمه‌ای بر شبکه‌های عصبی بازگشتی (RNN)» به بررسی روش‌های استفاده از یک شبکه‌ی عصبی بازگشتیِ آموزش داده‌شده برای پیش‌بینی داده‌هایی با طول دنباله‌های ورودی دیگری (گام‌های زمانی متفاوت) می‌پردازیم.کدهای مرتبط این جلسهروش اول:‎02_1_simple-RNN-diffrent-sequence-length.ipynbمشاهده:‌ باز کردن نوت‌بوک در NBViewerاجرا:‌ باز کردن نوت‌بوک در Google Colabروش دوم:‎02_2_simple-RNN-diffrent-sequence-length.ipynbمشاهده:‌ باز کردن نوت‌بوک در NBViewerاجرا:‌ باز کردن نوت‌بوک در Google Colabتطبیق با دوره ویدئوییقسمت سوم (۳۲ دقیقه) – پیاده‌سازی تخمین تابع با شبکه‌های بازگشتی ساده [دقایق پایانی]قسمت چهارم (۴ دقیقه) - طول دنباله متغیر در شبکه‌های بازگشتی (۱)قسمت پنجم (۱۱ دقیقه) - طول دنباله متغیر در شبکه‌های بازگشتی (۲)مروردر جلسه‌‌ی دوم دوره به سلول‌های بازگشتی پرداخته و همچنین معادلات مربوط به آن‌ها را بررسی کردیم. در جلسه‌ی سوم به پیاده‌سازی یک شبکه‌ی عصبی بازگشتی ساده با استفاده از کتاب‌خانه‌ی کراس (Keras) برای پیش‌بینی روند یک تابع سینوسی پرداختیم و ساختار شبکه و پارامترهای آن را بررسی کردیم.مقدمهدر این جلسه، به بررسی راهکارهای تعمیم مدل (Generalization) و اجرای آن به‌ازای طول دنباله‌های ورودی یا گام‌های زمانی (Timestep) مختلف می‌پردازیم و بررسی می‌کنیم چگونه می‌توان از یک مدل که با یک گام‌زمانی مشخص آموزش دیده، برای پیش‌بینی داده‌هایی با گام‌‌زمانی دیگر استفاده کرد.لازم به ذکر است همان‌طورکه در بخش پیش‌نیازهای دوره گفته شد، برای درک درست این دوره نیاز است با زبان پایتون (Python)، کتاب‌خانه‌ی کراس (Keras) و ساخت شبکه‌ها به دو حالت Sequential API و Functional API آشنایی داشته باشید.دسترسی به کدهااین جلسه شامل دو بخش است که هر بخش یک نوت‌بوک مجزا دارد، برای مشاهده و دریافت کدهای این جلسه می‌توانید از طریق محزن گیت‌هاب فایل نوت‌بوک‌ها را دریافت کرده و یا از طریق لینک‌های ابتدای پست به‌صورت آنلاین مشاهده کنید. برای اجرای نوت‌بوک‌ به‌صورت آنلاین و رایگان می‌توانید از طریق لینک زیر هر نوت‌بوک را در سرویس Google Colab اجرا کنید:اجرا نوت‌بوک روش اول:‌ باز کردن نوت‌بوک در Google Colabاجرا نوت‌بوک روش دوم:‌ باز کردن نوت‌بوک در Google Colabتعمیم مدل بازگشتیدر جلسه‌ی پیش دیدیم که برای آموزش یک مدل شبکه‌ی عصبی بازگشتی، یک سلول (یا واحد) بارگشتی (RNN Unit [Cell]) را براساس تعداد گام‌های زمانی تکرار می‌کنیم. در نتیجه، با‌توجه‌به اینکه یک سلول یکسان بازگشتی در هر بار تکرار استفاده و آموزش داده‌می‌شود، وزن‌های یک شبکه به گام‌زمانی (Timestep) مرتبط نیستند. بنابراین از نظر تئوری می‌توانیم توقع داشته باشیم تا مدل به طول گام‌های زمانی هنگام آموزش (در مثال جلسه پیش ۱۰) وابسته نبوده و بتوان آن را برای گام‌های زمانی مختلف مجدداً اجرا کرد؛ برای مثال با دیدن پنج ورودی تابع سینوسی، مدل باید بتواند خروجی ششم و با دیدن ۲۰ ورودی، خروجی ۲۱ام را پیش‌بینی کند.یادآوریدر جلسه‌ی قبل و در بررسی «تعداد پارامترهای آموزشی» در قسمت «بررسی ساختار مدل (Model summary) - قسمت دوم» دیدیم که تعداد پارامتر‌های مدل به تعداد دفعات تکرار (Unroll) واحد بازگشتی وابسته نیست.در این جلسه دو روش ساده را برای آن‌که مدل را در یک گام‌زمانی (مثلاً ۱۰) آموزش داده و در گام‌زمانی دیگری (مثلاً ۲۰) تست کنیم بررسی می‌کنیم.تست اولیهپیش از بررسی این روش‌ها و بدون تغییر در مدل جلسه‌ی پیش، بررسی می‌کنیم که آیا می‌توانیم آن را برای گام زمانی دیگری (در اینجا ۵۰) اجرا کنیم یا خیر. پیش از اجرای Predict داده‌های فاز تست را به‌صورت گام‌های زمانی ۵۰تایی دسته‌بندی کرده و سپس همانند جلسه قبل، به فرمت مورد انتظار کتابخانه کراس تبدیل می‌کنیم:# changing step to 50 (prev. 10)
testX, testY = convertToDataset(test, 50)
# Reshaping to Keras requested format
testX = np.reshape(testX, (testX.shape[0], testX.shape[1], 1))
# -&gt; testX.shape: (450, 50, 1)حال سعی می‌کنیم مدل را با گام زمانی جدید Predict کنیم:testPredict= model.predict(testX)اما متوجه می‌شویم که با اجرای دستور Predict روی داده‌های جدید، خطای زیر را دریافت می‌کنیم:ValueError: Error when checking input: expected sequential_1_input to have shape (10, 1) but got array with shape (50, 1)در این خطا بیان شده که مدل انتظار ورودی‌ای با سایز (۱۰ , ۱) داشته اما ورودی‌ای با سایز (۵۰ , ۱) دریافت کرده است.دلیل این خطا این است که در هنگام تعیین ساختار مدل، سایز ورودی را به‌صورت مشخص تعیین نکرده بودیم؛ از این رو با اولین خوراک داده‌های ورودی در هنگام fit کردن (اولین mini-batch داده‌ها) مدل سایز ورودی خود را مشخص کرده و بنابراین انتظار ورودی‌هایی با گام زمانی برابر ۱۰ را دارد. همانند قبل (در شبکه‌های کانولوشنی) شبکه‌ی ابعاد ورودی را چک کرده و در صورت مغایرت خطا می‌دهد.در واقع شبکه از نظر منطقی مشکلی نداشته و خطای ارسالی، تنها از لحاظ نحو (سینتکس [Syntax]) بوده و به تعریف ساختار مدل مربوط است. برای رفع این مشکل کارهای متنوعی می‌توان انجام داد که در این جلسه ساده‌ترین روش (روش اول) و یک روش دیگر که در جلسات آینده به آن احتیاج خواهیم داشت (روش دوم) را بررسی می‌کنیم.تغییر در طول بازه‌های زمانی ورودی شبکه - روش اولنوت‌بوک:‌ ‎02_1_simple-RNN-diffrent-sequence-length.ipynbطولانی بود نخواندم (TL;DR)با بیان None به‌عنوان ابعاد ورودی لایه‌ی بازگشتی، مشخص می‌کنیم این مقدار متغیر بوده و نامشخص است.در این روش برای آموزش مدل کاملاً مشابه قبل عمل می‌کنیم، با این تفاوت که برای داده‌های تست، گام‌های زمانی را متفاوت با داده‌های آموزش و برابر ۲۰ قرار داده و هنگام تعریف ساختار مدل و معرفی لایه‌ی بازگشتی، سایز ورودی‌های این لایه را به‌صورت زیر تعریف می‌کنیم:model.add(SimpleRNN(units=64, input_shape=(None, 1),  activation=&amp;quottanh&amp;quot))در اینجا ورودی‌های مدل را به‌صورت مشخص بیان کردیم و با استفاده از None مشخص کرده‌ایم که تعداد گام‌های زمانی (Timesteps) میزانی نامشخص و متغیر بوده و سایز ویژگی‌های (فیچر [Feature]) هر ورودی برابر ۱ است.نکتهدر فریم‌ورک Tensorflow و کتاب‌خانه‌ی کراس (Keras)، معرفی input_shape برای یک لایه، شامل mini-batch نشده و تعداد نمونه‌های ورودی (Number of Sample) را بیان نمی‌کنیم.لازم به ذکر است که در این صورت و با مشخص‌کردن ضمنی ابعاد ورودی، می‌توانیم قبل از Fit کردن مدل، با استفاده از متد summary گزارشی از ساختار مدل دریافت کنیم. همچنین با اجرای دستور model.input می‌توانیم سایز ورودی را دریافت کنیم که به‌صورت زیر خواهد بود:model.input
# &lt;tf.Tensor &#039;simple_rnn_1_input:0&#039; shape=(?, ?, 1) dtype=float32&gt;همانطور که مشخص است، تعداد ورودی‌ها (Number of sequence - سایز mini-batch) و تعداد گام‌های زمانی (timestep) مقادیری نامشخص و متغیر تعریف شده‌اند.ادامه‌ی مراحل همانند جلسه‌ی پیش بوده. پس از آموزش مدل، می‌توانیم بر روی داده‌های تست که گام‌زمانی متفاوتی نسبت به داده‌های آموزش داشتند نیز پیش‌بینی گرفته و متد model.predict را روی داده‌های تست فراخوانی کنیم:trainPredict = model.predict(trainX)
testPredict = model.predict(testX)
predicted = np.concatenate((trainPredict, testPredict), axis=0)
...
plt.show()نمودار پیش‌بینی مدل در روش اولتغییر در طول بازه‌های زمانی ورودی شبکه - روش دومنوت‌بوک:‌ ‎02_2_simple-RNN-diffrent-sequence-length.ipynbطولانی بود نخواندم (TL;DR) وزن‌های مدل را بعد از آموزش را ذخیره کرده و هنگام تست مدل را با گام‌زمانی متفاوت لود می‌کنیم.همانطور که در مقدمه‌ی این جلسه اشاره شد، وزن‌های مدل بازگشتی به تعداد گام‌زمانی‌های آن وابسته نیست. بنابراین می‌توانیم از وزن‌های آموزش داده شده یک مدل، در اجرای آن مدل در گام‌زمانی‌ دیگری نیز استفاده کنیم. برای این کار نیاز است تا وزن‌های مدل را پس از آموزش ذخیره کنیم و مدلی با ساختار مشابه اما گام‌زمانی متفاوت ایجاد کنیم.در این روش نیز برای آموزش مدل، کاملاً مشابه قبل عمل می‌کنیم؛ اما این‌بار برای ساخت مدل از یک تابع استفاده می‌کنیم تا با دریافت تعداد گام‌زمانی (Timestep) مورد نظر، مدلی با سایز ورودی (Input Shape) متناسب با آن گام‌زمانی ایجاد کند. بدین‌صورت می‌توانیم به‌راحتی مدل دیگری با گام‌‌زمانی متفاوت اما ساختار یکسان بسازیم. بنابراین تابع build_model را به‌صورت زیر خواهیم داشت:def build_model(sequence_length):
    model = Sequential()
    model.add(SimpleRNN(units=64, input_shape=(sequence_length, 1), activation=&amp;quottanh&amp;quot))
    model.add(Dense(1))
 return modelسپس، برای ساخت مدل، این تابع را با تعداد گام‌زمانی مورد نظر صدا می‌زنیم:model = build_model(10)این بار هم چون سایز ورودی‌های مدل به‌صورت ضمنی مشخص شده‌اند، می‌توانیم قبل از Fit کردن مدل، با استفاده از متد summary گزارشی از ساختار مدل دریافت کنیم که به‌صورت زیر خواهد بود:# model.summary() output:
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
simple_rnn (SimpleRNN)       (None, 64)                4224 
_________________________________________________________________
dense (Dense)                (None, 1)                 65 
=================================================================
Total params: 4,289
Trainable params: 4,289
Non-trainable params: 0
_________________________________________________________________همین‌طور، گزارش ورودی‌های مدل نیز به‌صورت زیر خواهد بود:# model.input output:
&lt;tf.Tensor &#039;simple_rnn_input:0&#039; shape=(?, 10, 1) dtype=float32&gt;مشخص است که تعداد ورودی‌ها (Number of sequence - سایز mini-batch) مقداری نامشخص (کاراکتر ?) بوده، اما تعداد گام‌های زمانی (timestep) دیگر نامشخص نیست و برابر ۱۰ تعریف شده است.در ادامه مدل را همانند جلسات پیش کامپایل می‌کنیم:model.compile(loss=&#039;mean_squared_error&#039;, optimizer=&#039;adam&#039;)حال می‌خواهیم پس از آموزش مدل و تعیین وزن‌های (Weights) آن، آن‌ها را ذخیره کنیم. برای این‌کار از بازبانگ‌های (‏‏Callback) تنسورفلو (Tensorflow) استفاده می‌کنیم.بازبانگ‌های (‏‏Callback) تنسورفلو (Tensorflow)بازبانگ‌ها (بازندا [Callback]) عموماً توابعی هستند که پس از رخداد یک رویداد (Event) خاص اجرا می‌شوند. با کمک بازبانگ‌ها می‌توانیم در زمان اجرا و بر اساس نوع رویداد فرآیندهای لازم را اجرا کنیم. در تنسورفلو رویدادهای (Event) مختلفی مثل شروع یک تکرار (iteration - آموزش روی یک mini-batch)، پایان یک تکرار، شروع یک ایپاک (Epoch) و پایان یک ایپاک تعریف شده‌اند که می‌توان در هنگام Fit کردن مدل بازبانگ‌های مربوط به آن‌ها را مشخص کرد.علاوه‌بر این، تعدادی از این بازبانگ‌ها به‌دلیل اینکه به‌صورت مکرر مورد استفاده هستند از پیش تعریف شده و قابل استفاده هستند. یکی از این بازبانگ‌ها Checkpoint است که به کمک آن می‌توان بعد از پایان هر ایپاک مدل را ذخیره کرد (مشابه اجرای model.save در انتهای هر ایپاک). مطالعه بیشتربرای آشنایی بیشتر با Callbackهای تنسورفلو (Tensorflow) می‌توانید وبینار زیر به تدریس علیرضا اخوان‌پور مدرس همین دوره را مشاهده کنید: https://class.vision/product/using-callback-in-kerasبرای استفاده از این بازبانگ می‌توان آن را به‌صورت زیر در برنامه وارد کرد:from tensorflow.keras.callbacks import ModelCheckpointسپس به‌صورت زیر یک بازبانگ جدید از کلاس ModelCheckpoint تعریف می‌کنیم:# Directory where the checkpoints will be saved
checkpoint_dir = &#039;./notebook02_training_checkpoints&#039;
# Name of the checkpoint files
checkpoint_prefix = os.path.join(checkpoint_dir, &amp;quotckpt_{epoch}&amp;quot)

checkpoint_callback=ModelCheckpoint(
    filepath=checkpoint_prefix,
    save_weights_only=True)این کلاس یک آدرس برای ذخیره‌سازی فایل دریافت می‌کند. استفاده از فرمت از پیش مشخص تنسورفلو به‌صورت {epoch} باعث می‌شود که شماره‌ی هر ایپاک در نام فایل نوشته شده و ذخیره شود. همچنین با فعال‌کردن ویژگی save_weights_only مشخص کرده‌ایم که نیازی به ذخیره‌ی معماری مدل نیست و تنها ذخیره‌ی وزن‌های آن کافی است.نکتهبهتر است دایرکتوری حاوی فایل‌ها را از پیش ساخته باشید.نکتهاین بازبانگ یک کلاس تنسورفلویی بوده و برخلاف model.save کراس که با فرمت h5 مدل را ذخیره می‌کرد، با فرمت خاص خود مدل را ذخیره می‌کند.آموزش مدلپس از ساخت بازبانگ، در هنگام Fit کردن مدل به‌صورت زیر آن را به مدل معرفی می‌کنیم:history = model.fit(trainX,trainY, epochs=100, batch_size=16,
                    verbose=2, callbacks=[checkpoint_callback])همانطور که مشخص است، متد Fit لیستی از بازبانگ‌ها دریافت می‌کند که در اینجا آرایه‌ای شامل باز‌بانگ فوق (checkpoint_callback) را برای آن مشخص کردیم.نکتهاگر خروجی اجرای سلول بالا را در نوت‌بوک مربوط به این جلسه مشاهده کنید، متوجه می‌شوید که پس از اجرای این سلول، تعدادی هشدار چاپ شده است. این هشدارها مربوط به این است که مدل کراس را با فرمت تنسورفلو ذخیره می‌کنیم و بنابراین پارامترهای مربوط به optimizer مدل که توسط کراس تعریف شده‌اند ذخیره نمی‌شوند. این مورد مشکلی برای ما به‌وجود نخواهد آورد.تست مدلحال پس از آموزش مدل، وزن‌های آموزش دیده‌ی مدل را در اختیار داریم. این وزن‌ها در  ۱۰۰ جفت فایل (چرا که در ۱۰۰ ایپاک مدل را آموزش داده‌ایم - فایل شاخص [Index] و فایل داده‌ها) در پوشه‌ی notebook02_training_checkpoints با فرمت نام مشخص‌شده ایجاد شده‌اند.برای دریافت آدرس آخرین وزن‌های ذخیره شده، می‌توان از متد آماده‌ی زیر تنسورفلو کمک گرفت:tf.train.latest_checkpoint(checkpoint_dir)
# output: &#039;./notebook02_training_checkpoints\\ckpt_100&#039;در فاز تست این روش، می‌خواهیم مدل را با طول گام‌زمانی متفاوتی (در اینجا ۲۰) اجرا کنیم، برای این‌کار یک مدل جدید (با وزن‌های تصادفی) می‌سازیم:model = build_model(20)و وزن‌های آموزش دیده را در این مدل بارگذاری (Load) می‌کنیم. برای این‌کار از متد load_weights به‌صورت زیر استفاده می‌کنیم:model.load_weights(tf.train.latest_checkpoint(checkpoint_dir))پیش از پیش‌بینی توسط مدل نیاز است آن را Build یا کامپایل (Compile) کنیم:model.compile(loss=&#039;mean_squared_error&#039;, optimizer=&#039;adam&#039;)نکتهدر اینجا تابع هزینه (loss) و Optimizer تنها برای اجرای صحیح تابع کامپایل compile مشخص شده‌اند و کاربردی ندارند.سپس می‌توانیم همانند قبل، از مدل استفاده کنیم:model.evaluate(testX, testY, verbose=0)
# output: 0.841938066482544در این جلسه در تکمیل مباحث جلسه‌‌ی قبلی، روش‌های اجرای مدل بازگشتی در طول‌های متفاوت گام‌زمانی را بررسی کردیم. همچنین با  نحو کد‌های (Syntax) کراس (Keras) و بازبانگ‌های (Callback) تنسورفلو (Tensorflow) بیشتر آشنا شدیم. همچنین لازم به‌ذکر است که دو روشی که در این جلسه بررسی شدند، روش‌های ساده‌ای بودند که در جلسات آینده‌ی دوره به آن‌ها نیاز خواهیم داشت. رویکرد استفاده‌ی مجدد از وزن‌های آموزش دیده، رویکرد رایجی در آموزش شبکه‌های عصبی‌ست که در شبکه‌های غیربازگشتی -مانند شبکه‌های کانولوشنال (Convolutional) - نیز کاربرد دارد.در جلسه‌ی بعدی به بررسی دو مشکل رایج شبکه‌های عصبی بازگشتی یعنی محو شدگی و انفجار گرادیان‌ها (Exploding and Vanishing Gradients) در شبکه‌های بازگشتی می‌پردازیم.می‌توانید لیست جلسات دوره را در این پست مشاهده کنید.جلسه‌ٔ قبلیجلسه‌ٔ بعدی (در دست انتشار)این دوره به کوشش علیرضا اخوان‌پور به‌صورت ویدئویی تهیه شده و به قلم محمدحسن ستاریان با نظارت ایشان به‌صورت متنی نگارش و توسط بهار برادران افتخاری ویرایش شده‌ست.در صورت تمایل به خرید دوره به‌صورت ویدئویی می‌توانید با استفاده از کد تخفیف rnn4 از ۲۰ درصد تخفیف بهره‌مند شوید.</description>
                <category>مجموعه دانش‌بنیان شناسا</category>
                <author>مجموعه دانش‌بنیان شناسا</author>
                <pubDate>Wed, 24 Nov 2021 15:56:26 +0330</pubDate>
            </item>
                    <item>
                <title>آیا هوش مصنوعی بهتر از انسان عمل می‌کند؟</title>
                <link>https://virgool.io/@shenasa/%D8%A2%DB%8C%D8%A7-%D9%87%D9%88%D8%B4-%D9%85%D8%B5%D9%86%D9%88%D8%B9%DB%8C-%D8%A8%D9%87%D8%AA%D8%B1-%D8%A7%D8%B2-%D8%A7%D9%86%D8%B3%D8%A7%D9%86-%D8%B9%D9%85%D9%84-%D9%85%DB%8C-%DA%A9%D9%86%D8%AF-ytmdv7gdpsb4</link>
                <description>وقتی که اصطلاح هوش مصنوعی (artificial intelligence) در سال ۱۹۵۰ برای اولین بار مطرح شد، رویای نهایی‌ای که برای آن متصور می‌شدند، خلق فناوری‌ای بود که از انسان باهوش‌تر باشد. از آن زمان تا کنون، تحقیقات در زمینه هوش مصنوعی پستی‌ها و بلندی‌های فراوانی را تجربه کرده است. با این حال، از زمان پیدایش یادگیری ماشین و به دنبال آن یادگیری عمیق، به نظر می‌رسد هوش مصنوعی با سرعت بیشتری در حال رشد است.امروزه کارهای زیادی وجود دارند که هوش مصنوعی می‌تواند بهتر و سریع‌تر از انسان انجام دهد. حتی مقوله خلاقیت که پیش از این برای سیستم‌های هوش مصنوعی غیرقابل دسترسی متصور می‌شد، درحال دستیابی است.آیا سیستم‌های هوش مصنوعی از انسان‌ها بهتر عمل می‌کنند؟نه کاملاً. قدرت بشریت جای دیگری نهفته است. ما می‌توانیم به‌سرعت یاد بگیریم و خودمان را با شرایط مختلف وقف دهیم. برای سیستم‌های هوش مصنوعی، این مسأله یک مانع واقعی است. به عنوان مثال، برای تسلط بر یک بازی رایانه‌ای نسبتاً ساده، که یادگیری آن به طور متوسط ۱۵ دقیقه طول می‌کشد، سیستم‌های هوش مصنوعی حدود ۹۲۴ ساعت زمان نیاز دارند. در مورد سازگاری نیز می‌توان گفت که اگر فقط یک قانون در بازی تغییر کند، سیستم هوش مصنوعی باید کل بازی را ابتدا یاد بگیرد.دلیل دیگری که سیستم‌های هوش مصنوعی هنوز قدری دارای ریسک هستند این است که وقتی آن‌ها اشتباه می‌کنند، اشتباهشان فاحش است. در واقع به دلیل این که این سیستم‌ها درک صحیحی از واقعیت ندارند ممکن است دچار اشتباهاتی شوند که جبران‌ناپذیر است. به عنوان مثال فرض کنید یک کودک در سایت youtube به دنبال تماشای یک موزیک ویدیوی کودکانه است، اما سیستم هوش مصنوعی بر اساس یک تعبیر اشتباه نتایجی را برای کودک نمایش می‌دهد که مناسب با سن او نیست. این یک اشتباه فاحش با نتایج جبران‌ناپذیر است، در حالی که هیچ انسانی تحت هیچ شرایطی ممکن نبود چنین تعبیری از عبارت جستجو شده توسط کودک داشته باشد.چرا سیستم‌های هوش مصنوعی اشتباه می‌کنند؟ریشه اشتباهاتی که ممکن است سیستم‌های هوش مصنوعی مرتکب شوند را باید در دو بخش جستجو کرد. این اشتباهات ممکن است ناشی از عدم دقت کافی در فاز آموزشی باشند، و یا قدری عمیق‌تر، در نقص‌های ذاتی سیستم‌های هوش مصنوعی ریشه داشته باشد.خطاهای هوش مصنوعی ناشی از اشتباهات فاز آموزشسیستم‌های هوش مصنوعی به شدت متکی به داده‌هایی هستند که در فاز آموزش مورد استفاده قرار گرفته است. اگر در این داده‌ها برخی از خطاهای انسانی وارد شود، سیستم هوش مصنوعی نیز بر اساس همان اشتباهات تعلیم می‌بیند و آن‌ها را تکرار می‌کند. به عنوان مثال در بازارهای مالی ازدحام خریداران باعث ایجاد هیجان در بازار شده و قیمت دچار یک رشد حبابی می‌شود. این حباب‌های قیمتی به صورت ناگهانی می‌ترکند و باعث ریزش شدید قیمت شده و در نتیجه بسیاری از مردم سرمایه‌ی خودشان را از دست می‌دهند. اگر این داده‌ها به صورت فیلتر نشده برای آموزش سیستم هوش مصنوعی استفاده شود، منجر به انتقال خطاهایی به سیستم می‌شود که در عملکرد آن تاثیر منفی دارد.نقص‌های ذاتی هوش مصنوعییکی از چالش‌های پیش‌روی محققان این است که آیا ربات‌ها می‌توانند همانند یک انسان وظایف خود را به خوبی انجام دهند. با وجود تمام پیشرفت‌های انجام شده در این زمینه، هنوز امکان جایگزینی کامل ربات‌ با انسان وجود ندارد. در واقع لازم است ربات‌ها از سطحی که در حال حاضر هستند پیشرفته‌تر شوند. برای دستیابی به این هدف، به منابع محاسباتی عظیمی نیاز است که در حال حاضر عملاً امکان‌پذیر نیست.با وجود پیشرفت‌های فراوانی که در حوزه‌ی هوش مصنوعی صورت پذیرفته است، هنوز در بسیاری از موارد هوش مصنوعی قادر به انجام کارها در سطح انسان نیست. در ادامه تعدادی از ضعف‌های هوش مصنوعی بیان می‌شود که موجب عملکرد ضعیف‌تر هوش مصنوعی شده‌اند.۱. عدم خلاقیتخلاقیت یکی از ویژگی‌های بارز انسان‌هاست. در سال‌های اخیر هوش مصنوعی به اندازه‌ای پیشرفت یافته است که قادر است بتواند کارهای هنری - مانند یک قطعه موسقی - بسازد. با این حال، این کارهای هنری فاقد خلاقیت منحصر به فردی است که تنها انسان‌ها از آن برخوردارند. هوش مصنوعی می‌تواند کارهای خلاقانه تولید کند اما کارهای خلاقانه هوش مصنوعی تحت‌ تاثیر ورودی‌هایی است که به آن داده می‌شود و این کارها نیز بدون درک و آگاهی انجام می‌شود.۲. نداشتن قدرت تخیلمشابه با خلاقیت، توانایی تصور کردن تنها منحصر به انسان‌هاست. همان‌طور که قبل از این بیان شد، هوش مصنوعی تنها اقداماتی را انجام می‌دهد که از پیش تعریف شده باشد. هرچه فرآیند آموزش یک سیستم هوش مصنوعی بهتر و دقیق‌تر انجام شود، توانایی انجام کارهای پیچیده‌تر نیز بیشتر خواهد بود؛ اما چیزی که هوش مصنوعی قادر به انجام دادن آن نیست انجام وظایفی فراتر از آن‌ چیزی است که برای آن آموزش دیده است. انسان‌ها می‌توانند با استفاده از قدرت تصورشان، در هنگام مواجهه با شرایط جدید، تصمیم مناسبی اتخاذ کند.۳. مهارت‌های ارتباطی ضعیفیکی دیگر از ویژگی‌های منحصر به فرد انسان‌ها، مهارت‌های ارتباطی موثر با دیگران است. برقراری ارتباط یکی از نیازهای مهم در هر کسب و کاری است. هوش مصنوعی قادر به برقراری ارتباط موثر و کارآمد با دیگران نیست. یکی از دلایل عدم توانایی برقراری ارتباط در هوش مصنوعی، عدم توانایی آن‌ها در درک احساسات است. بنابراین، به عنوان مثال در فرآیندهایی که ارتباط موثر با کاربر یک امر حیاتی است، هوش مصنوعی ناکارآمد خواهد بود.کارهایی که هوش مصنوعی بهتر از انسان انجام می‌دهدبا وجود تمام موارد گفته‌شده، کارهایی هست که هوش مصنوعی در انجام آن‌ها عملکرد بهتری از انسان‌ها دارد. در این قسمت از مقاله نگاهی به نمونه‌هایی از این دسته می‌اندازیم.بازی کردندر سال ۲۰۱۶، وقتی که هوش مصنوعی توانست لی سدول قهرمان وقت بازی «GO» را شکست دهد، بسیاری از محققان شگفت‌زده شدند. پس از آن، در سال ۲۰۱۷، یک شبکه عصبی جدید تحت عنوان «AlphaGo Zero» توانست نسخه قدیمی‌تر Alpha Go را ۱۰۰ مرتبه شکست دهد. اهمیت این اتفاق از آن جهت بود که AlphaGo Zero تنها با استفاده از یک سری قوانین اولیه بازی خودش را آموزش داده بود.مثال دیگری که در این زمینه می‌توان به آن اشاره کرد، پیروزی کامپیوتر «Deep Blue» از شرکت IBM در مقابل قهرمان سابق شطرنج جهان گری کاسپارف در سال ‍۱۹۹۷ است. کاسپاروف ۶ مرتبه با کامپیوتر شرکت IBM بازی کرد که در نهایت با نتیجه ۳.۵ بر ۲.۵ مغلوب شد. وقتی از قهرمان شطرنج جهان درباره علت شکستش در این مسابقه سوال پرسیده شد، او پاسخ داد که «من ریسک می‌کردم اما او ریسک نمی‌کرد».تشخیص‌های پزشکیپژوهشگران بیمارستان آکسفورد موفق به توسعه یک سیستم منطبق بر هوش مصنوعی شدند که قادر است از طریق اسکن قلب و ریه، شدت بیماری را تشخیص دهد. این اقدام به صورت معمول توسط پزشکان انجام می‌شود اما برنامه‌های کامپیوتری به‌گونه‌ای طراحی شده‌اند که بتوانند نتایج بهتری حتی نسبت به پزشکان باتجربه داشته باشند. اهمیت تشخیص دقیق بیماری از آن جهت است که منجر به کاهش چشمگیر هزینه‌های درمان و اجتناب از جراحی‌های بی‌مورد می‌گردد.از فناوری هوش مصنوعی در زمینه تومورشناسی و تشخیص سرطان که همواره برای انسان‌ها یک موضوع چالش‌برانگیز بوده است نیز استفاده می‌شود. بر اساس پژوهش انجام شده در دانشگاه بیرمنگام، سیستم‌های هوش مصنوعی توانستند با دقتی معادل با ۸۷ درصد وجود سرطان را در بیماران تشخیص دهند، در حالی که این دقت برای متخصصان برابر با ۸۶ درصد بوده است. علاوه بر این سیستم هوش مصنوعی توانست با دقتی معادل با ۹۳ درصد، عدم وجود سرطان در بیماران را تشخیص دهد که این آمار نیز برای متخصصان معادل با ۹۱ درصد بود.هوش مصنوعی قادر به کار کردن در جاهایی است که در آن‌ها خطر مرگ وجود داردیکی از مزایای هوش مصنوعی ساخت ربات‌هایی است که می‌توانند در شرایط سخت و خطرناک کارهایی را انجام دهند که انسان‌ها قادر به انجام آن‌ها نیستند. این ربات‌ها به مکان‌هایی وارد می‌شوند که هیچ انسانی امکان زنده ماندن در آن‌جا را ندارد. به عنوان مثال در ادامه به دو مورد از این مکان‌ها اشاره شده است.اعماق اقیانوس‌هابسیاری از مردم از خطرات ورود به اعماق دریا اطلاعی ندارند. تغییرات فشار در اعماق دریا با تغییرات فشار در فضا برابری می‌کند. افرادی که به اعماق آب وارد می‌شوند دچار مشکلات فراوانی در سلامتی‌شان خواهند شد. با این حال غواصی در دریا برای صنایع مختلف حائز اهمیت است. علاوه بر این در زمینه‌های پژوهشی در حوزه شناسایی موجودات دریایی، در مواردی لازم است کف اقیانوس‌ها مورد بررسی قرار گیرد. در کف اقیانوس‌ها فشار آب به قدری بالاست که انسان‌ها قادر به سفر به آن‌جا نیستند. برای رفع این مشکل می‌توان از ربات‌ها استفاده کرد. این ربات‌ها می‌توانند به اعماقی از دریا وارد شوند که انسان‌ها امکان زنده ماندن در آن اعماق را ندارند.نیروگاه‌های اتمیکار کردن در مکان‌هایی که تشعشعات رادیواکتیو وجود دارد برای انسان‌ها به شدت مضر است. انسان‌ها تنها در صورتی می‌توانند به این مکان‌ها وارد شوند که لباس‌های مخصوصی پوشیده باشند و برای مدت کوتاهی فعالیت کنند. در هر صورت با وجود رعایت تمام موارد ایمنی، باز هم نمی‌توان به‌طور صد درصد گفت که شخص آسیب نمی‌بیند. برای این منظور ربات‌های مخصوصی طراحی شده است که می‌توانند جایگزین انسان‌ها شوند.نویسنده: بنیامین زارعیمنابع:1. https://wiredelta.com/5-things-ai-does-better-than-humans-2019/#:~:text=AI%20has%20already%20proved%20it,future%20of%20many%20other%20technologies.2. https://en.wikipedia.org/wiki/Deep_Blue_versus_Garry_Kasparov3. https://www.vodafone-institut.de/aiandi/5-things-machines-can-already-do-better-than-humans/4. https://georgezarkadakis.medium.com/5-things-ai-can-do-better-than-humans-6dacad0658485. https://www.theguardian.com/technology/2019/sep/24/ai-equal-with-human-experts-in-medical-diagnosis-study-finds6. https://internationaldirector.com/technology/ai-errors-vs-human-errors/7. https://www.smartdatacollective.com/7-jobs-humans-can-do-better-than-robots-and-ai/8. https://www.forbes.com/sites/bernardmarr/2019/11/11/13-mind-blowing-things-artificial-intelligence-can-already-do-today/?sh=437a50516502</description>
                <category>مجموعه دانش‌بنیان شناسا</category>
                <author>مجموعه دانش‌بنیان شناسا</author>
                <pubDate>Sun, 07 Nov 2021 12:22:57 +0330</pubDate>
            </item>
                    <item>
                <title>اولین سیستم پرداخت آنلاین بر اساس چهره در متروی مسکو</title>
                <link>https://virgool.io/@shenasa/%D8%A7%D9%88%D9%84%DB%8C%D9%86-%D8%B3%DB%8C%D8%B3%D8%AA%D9%85-%D9%BE%D8%B1%D8%AF%D8%A7%D8%AE%D8%AA-%D8%A2%D9%86%D9%84%D8%A7%DB%8C%D9%86-%D8%A8%D8%B1-%D8%A7%D8%B3%D8%A7%D8%B3-%DA%86%D9%87%D8%B1%D9%87-%D8%AF%D8%B1-%D9%85%D8%AA%D8%B1%D9%88%DB%8C-%D9%85%D8%B3%DA%A9%D9%88-q8m0j3ryzgmv</link>
                <description>متروی مسکو برای اولین بار در جهان سیستم پرداخت کرایه بر اساس فناوری تشخیص چهره را معرفی کرد. این سیستم که با عنوان Face Pay نامگذاری شده است، در بیش از ۲۴۰ ایستگاه در شهر مسکو نصب شده است. مسافران در صورت استفاده از این سیستم، بدون نیاز به استفاده از کارت اعتباری و یا تلفن همراه خود، می‌توانند با مترو سفر کنند. آن‌ها برای عبور از گیت‌های ایستگاه مترو تنها لازم است به دوربین مقابلشان نگاه کنند و سپس وارد شوند.برای فعال‌سازی Face Pay، مسافران باید عکس، کارت بانکی و کارت حمل و نقل خود را از طریق برنامه موبایل مترو مسکو به سرویس متصل کنند. اطلاعات مسافران به صورت ایمن رمزگذاری می‌شود. مقامات متروی مسکو پیش‌بینی کرده‌اند که طی سه سال آینده، بیش از ۱۵ درصد از مسافران به صورت منظم از این سیستم استفاده می‌کنند.در حال حاضر مسکو اولین شهر جهان است که از یک سیستم تشخیص چهره در چنین مقیاسی استفاده می‌کند. در هیچ جای دنیا سیستمی معادل با Face Pay از نظر کیفیت و سهولت استفاده برای مسافران وجود ندارد.مقامات پایتخت روسیه پیش از این نیز به طور گسترده از فناوری تشخیص چهره در سراسر پایتخت به منظور انجام امور نظارتی استفاده کرده‌اند. در این سیستم از شبکه‌ای شامل تقریباً ۲۰۰ هزار دوربین نظارتی برای شناسایی مظنونان جنایی استفاده شده است.نویسنده: بنیامین زارعیمنبع:https://www.themoscowtimes.com/2021/10/15/moscow-metro-introduces-worlds-first-pay-by-face-system-a75300</description>
                <category>مجموعه دانش‌بنیان شناسا</category>
                <author>مجموعه دانش‌بنیان شناسا</author>
                <pubDate>Sat, 30 Oct 2021 11:15:55 +0330</pubDate>
            </item>
                    <item>
                <title>توصیه‌های Andrew Ng برای استفاده از هوش مصنوعی در شرکت‌ها</title>
                <link>https://virgool.io/@shenasa/%D8%AA%D9%88%D8%B5%DB%8C%D9%87-%D9%87%D8%A7%DB%8C-andrew-ng-%D8%A8%D8%B1%D8%A7%DB%8C-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-%D9%87%D9%88%D8%B4-%D9%85%D8%B5%D9%86%D9%88%D8%B9%DB%8C-%D8%AF%D8%B1-%D8%B4%D8%B1%DA%A9%D8%AA-%D9%87%D8%A7-g8o3xuqovzbg</link>
                <description>اندرو انگ (Andrew Ng) رئیس سابق Google Brain، دانشمند ارشد Baidu و همچنین موسس سایت Coursera است که به صورت منظم کلاس‌هایی را به صورت آنلاین و  یا در دانشگاه استنفورد برگزار می‌کند. او همچنین موسس شرکت Landing AI است که به کارخانه‌‌ها و تولیدکنندگان صنعتی کمک می‌کند تا بتوانند مدل‌های منطبق بر بینایی کامپیوتر را اجرا کنند.این تجارب باعث شده است که Andrew Ng درک عمیقی از موضوعات مرتبط با هوش مصنوعی داشته باشد و به خوبی محدودیت‌های این تکنولوژی را بشناسد. او با بررسی شرکت‌های مختلف که به دنبال استفاده از فناوری هوش مصنوعی در کارهایشان هستند، به این نتیجه رسیده است که شرکت‌ها انتظارات نامتعارفی از فناوری هوش مصنوعی دارند. در ادامه توصیه‌های او که در مصاحبه با سایت protocol بیان کرده است را اعلام می‌کنیم.اندرو انگ اعتقاد دارد که در آینده‌ی نزدیک اکثر شرکت‌ها از فناوری هوش مصنوعی در فعالیت‌هایشان استفاده می‌کنند. بسیاری از شرکت‌های بزرگ در حال حاضر حداقل یک پروژه‌ی مبتنی بر هوش مصنوعی انجام داده‌اند و از این بابت جلوتر از سایرین هستند. البته این اتفاق برای صنایع سنتی که هنوز موج دیجیتالی شدن در آن‌ها به‌وجود نیامده است قدری زود به نظر می‌رسد.یکی از کارهای مهمی که شرکت‌ها در این مسیر می‌توانند انجام دهند، تعریف اهداف کوتاه‌مدت است. در واقع شرکت‌ها باید قدم به قدم در این مسیر پای بگذارند. با تعریف پروژه‌های کوچک و اتمام آن‌ها، این شرکت‌ها یاد می‌گیرند که چگونه باید پروژه‌های بعدی را تعریف کنند. متاسفانه بعضی از شرکت‌ها پروژه‌های بزرگی برای خودشان تعریف می‌کنند که در انجام آن‌ها دچار مشکل می‌شوند. «این که اولین پروژه شما یک پروژه ۱۰ میلیون دلاری نباشد مشکل خاصی ایجاد نمی‌کند. بهتر است برای شروع پروژه‌های ۵۰ تا ۲۰۰ هزار دلاری تعریف کنید. نگاه شما به این پروژه‌ها باید صرفا یادگیری و کسب تجربه باشد تا درآمدزایی.»یکی از چالش‌های هوش مصنوعی این است که برای درک این که چه چیزی امکان‌پذیر است و چه چیزی نیست، به مقدار کافی دانش فنی نیاز است. هنوز برخی از شرکت‌ها بر روی پروژه‌هایی سرمایه‌گذاری می‌کنند که از نظر فنی غیرممکن هستند و یا با استفاده از تکنولوژی‌های امروزی و یا حتی تکنولوژی‌های نسل‌های بعد نیز هم‌خوانی ندارند. به عنوان مثال در حال حاضر ساخت یک چت‌بات که بتواند تمام سوالات مشتریان را به شکلی متقابل پاسخ دهد، غیرممکن است.اندرو انگ درباره دلایلش برای ورود به دنیای تولیدات صنعتی این‌گونه می‌گوید: «من همیشه در مراکز صنعتی مشکلات مشابهی را مشاهده می‌کردم. این مراکز همواره در بکارگیری فناوری هوش مصنوعی در کنار نیروی‌های انسانی دچار مشکل بودند. هزاران پروژه در این مسأله دچار مشکل شده بودند؛ زیرا حتی اگر یک شرکت بتواند یک مدل هوش مصنوعی را پیاده‌سازی کند، بسیار دشوار است که بتواند تمام نرم‌افزارهای پیرامون را نیز بر اساس آن تغییر دهد. ما در نهایت LandingLens را ساختیم که یک پلتفرم داده‌محور و منطبق بر یادگیری ماشین است. ما به کارخانه‌ها کمک کردیم تا بتوانند بیش از ۱۰ برابر عملکردشان را بهبود دهند.»اندو انگ به شرکت‌های مختلف توصیه می‌کند که ظرفیت‌های هوش مصنوعی خود را بشناسند و از یک فلسفه‌ی درست و ابزارهای مناسب برای این هدف استفاده کنند. در صورت توجه به این نکات فناوری هوش مصنوعی می‌تواند کارایی آن‌ها را افزایش دهد و همچنین باعث کاهش هزینه‌های آن‌ها شود.نویسنده: بنیامین زارعیمنابع:https://www.protocol.com/enterprise/andrew-ng-ai-strategy</description>
                <category>مجموعه دانش‌بنیان شناسا</category>
                <author>مجموعه دانش‌بنیان شناسا</author>
                <pubDate>Sun, 17 Oct 2021 13:53:08 +0330</pubDate>
            </item>
                    <item>
                <title>مقدمه‌ای بر شبکه‌های عصبی بازگشتی - جلسهٔ سوم</title>
                <link>https://virgool.io/@shenasa/%D9%85%D9%82%D8%AF%D9%85%D9%87-%D8%A7%DB%8C-%D8%A8%D8%B1-%D8%B4%D8%A8%DA%A9%D9%87-%D9%87%D8%A7%DB%8C-%D8%B9%D8%B5%D8%A8%DB%8C-%D8%A8%D8%A7%D8%B2%DA%AF%D8%B4%D8%AA%DB%8C-%D8%AC%D9%84%D8%B3%D9%87%D9%94-%D8%B3%D9%88%D9%85-uqpp4e2yosxf</link>
                <description>در جلسهٔ سوم از دوره‌ی «مقدمه‌ای بر شبکه‌های عصبی بازگشتی (RNN)» به پیاده‌سازی یک شبکه‌ی RNN ساده با استفاده از کتاب‌خانه‌ی کراس (Keras) می‌پردازیم.کدهای مرتبط این جلسه‎01_simple-RNN.ipynbمشاهده:‌ باز کردن نوت‌بوک در NBViewerاجرا:‌ باز کردن نوت‌بوک در Google Colabتطبیق با دوره‌ی ویدئوییقسمت سوم (۳۲ دقیقه) – پیاده‌سازی تخمین تابع با شبکه‌های بازگشتی سادهمروردر جلسهٔ اول دوره، با ماهیت و انواع شبکه‌های عصبی بازگشتی آشنا شده و فهمیدیم شبکه‌های RNN برای پردازش توالی‌ها و الگوهای متشکل از چندین مرحله استفاده می‌شوند. در جلسهٔ دوم به سلول‌های بازگشتی پرداخته و همچنین معادلات مربوط به آن‌ها را بررسی کردیم.مقدمهدر این جلسه به پیاده‌سازی یک شبکه عصبی بازگشتی ساده با استفاده از کتاب‌خانه کراس (Keras) پرداخته و این شبکه را برای پیش‌بینی روند یک تابع سینوسی آموزش می‌دهیم و عملکرد آن را بررسی می‌کنیم. پیش‌بینی روند تابع که یک تسک از نوع رگرسیون (Regression) می‌باشد، عموما نیازمند حافظه‌ای‌ست که بتواند توسط آن روند کلی پیشرفت تابع را درک کند، از این رو شبکه‌های عصبی بازگشتی انتخاب مناسبی برای این تسک‌ است.لازم به ذکر است همان‌طورکه در بخش پیش‌نیازهای دوره گفته شد، برای درک درست این دوره نیاز است با زبان پایتون (Python)، کتاب‌خانه‌ی کراس (Keras) و ساخت شبکه‌ها به دو حالت Sequential API و Functional API آشنایی داشته باشید.دسترسی به کدهابرای مشاهده و دریافت کدهای این جلسه می‌توانید از طریق محزن گیت‌هاب فایل نوت‌بوک را دریافت کرده و یا از طریق این لینک به‌صورت آنلاین مشاهده کنید. برای اجرای نوت‌بوک‌ به‌صورت آنلاین و رایگان می‌توانید از طریق لینک زیر نوت‌بوک را در سرویس Google Colab اجرا کنید:اجرا:‌ باز کردن نوت‌بوک در Google Colabپیاده‌سازی شبکهٔ بازگشتی ساده (SimpleRNN)در ابتدا کتابخانه‌های مورد نیاز خود را import می‌کنیم:import pandas as pd
import numpy as np

import matplotlib.pyplot as plt

from keras.models import Sequential
from keras.layers import Dense, SimpleRNNسه خط اول این تکه کد مربوط به وارد کردن کتابخانه‌های استانداردی‌ست که در اکثر برنامه‌های خود استفاده می‌کنیم:کتاب‌خانه pandas برای کار با داده‌هاکتاب‌خانه numpy برای کار با ماتریس‌های چند-بعدی و تنسورها (Tensor)کتاب‌خانه‌ matplotlib برای ترسیمات و نمودارهاهمچنین از کتاب‌خانه‌ی کراس (Keras)، کلاس sequential (ساخت مدل به‌صورت لایه-لایه) و از keras.layers علاوه‌بر شبکه‌ی Dense (برای پیاده‌سازی شبکه‌های تمام-متصل) در اینجا SimpleRNN را نیز برای پیاده‌سازی شبکه‌های عصبی بازگشتی وارد می‌کنیم.‏لایه simpleRNN همان شبکه‌ی عصبی بازگشتی ساده‌ای‌ست که تا این جلسه خوانده‌ایم.ایجاد مجموعه دادهایجاد یک سریِ سینوسی برای ۱۵۰۰ گام زمانی (timestep) با نویز تصادفی.برای آموزش مدل از یک تابع سینوسی ساده که مقداری نویز بر آن اعمال شده استفاده می‌کنیم. برای ایجاد این مجموعه‌داده‌، به‌صورت زیر خروجی یک تابع سینوسی را به‌ازای ورودی‌های ۰ تا ۱۵۰۰ (۱۵۰۰ گام زمانی [timestep]) ذخیره می‌کنیم.t = np.arange(0,1500)
x = np.sin(0.02*t)+ np.random.rand(1500) * 2
plt.plot(x)
plt.show()نحوه‌ی پیاده‌سازی تابع اهمیت چندانی ندارد، مهم خروجی تابع است که در نمودار زیر قابل مشاهده است:نمودار مجموعه‌داده ساختگیدر ادامه بررسی خواهیم کرد که آیا مدل بازگشتی ساده‌ی ما قادر به ادامه دادن روند تابع (با مشاهده‌ی روند قبلی تابع) است یا خیر.جدا کردن داده‌های آموزشی و آزمونپیش از این برای آموزش شبکه‌های تمام-متصل (fully-connected یا Dense)، برای تقسیم مجموعه داده به دیتاست‌های آموزش (Train) و آزمون (Test) داده‌ها را بُر زده (Shuffle) و به‌صورت تصادفی (Random) داده‌ها را جدا می‌کردیم.برای آموزش شبکه‌های عصبی بازگشتی، از آنجایی‌که هدف یادگیری یک سری زمانی‌ست؛ باید بسته به نوع مسئله، فرایندی برای جدا کردن داده‌های آموزش و آزمون انتخاب کنیم. این فرایند‌ها را می‌توانیم با بررسی مسائل مختلف و تجربه کردن یاد بگیریم.در مسئله پیش‌رو، بدین صورت عمل می‌کنیم که از ۱۵۰۰ گام زمانی‌ای که در مجموعه‌داده‌ی ساختگی خود تولید کردیم، تعدادی (برای مثال ۱۰۰۰ گام اول) را به‌عنوان ورودی شبکه در نظر گرفته و برای فاز آموزش استفاده می‌کنیم و تعداد باقی‌مانده (برای مثال ۵۰۰ گام آخر) را به‌عنوان خروجی مورد انتظار شبکه در نظر گرفته و برای فاز تست استفاده می‌کنیم.برای تقسیم مجموعه‌داده به دو مجموعه‌ی داده‌های آموزش و داده‌های آزمون به‌صورت زیر عمل می‌کنیم:train, test = x[0:1000], x[1000:]در اینجا ۱۰۰۰ داده ابتدایی مجموعه داده اصلی را به‌عنوان داده آموزش و مابقی را به‌عنوان داده آزمون جدا کرده‌ایم.مثال تکمیلیبرای درک بهتر مثال فوق، مثالی دیگر را در نظر بگیرید: فرض کنید مدلی برای پیش‌بینی روند ارزش یک سهام در بازار بورس آموزش می‌دهیم. می‌خواهیم با توجه به روند (برای مثال ۵ سال) گذشته بتوانیم روند آتی بازار را پیش‌بینی کنیم.آماده‌سازی داده و ایجاد ورودی (Input) و برچسب (Label)همانطورکه در جلسه‌ی قبل خواندیم، شبکه‌های عصبی بازگشتی از تکرار (به‌اصطلاح در کنار هم قرار گرفتن) یک واحد بازگشتی (سلول بازگشتی) تشکیل می‌شوند. برای مثال از کنار هم قرار گرفتن پنج سلول، پنج گام زمانی (timestep) و از کنار هم قرار گرفتن ۱۰۰ سلول، ۱۰۰ گام‌زمانی خواهیم داشت. در خیلی از مسائل، این که مسئله را در چند گام‌زمانی باز کنیم خود یک ابرپارامتر (Hyper Parameter) است.به‌بیان‌دیگر، ورودی شبکه‌های عصبی بازگشتی (RNN) دنباله‌هایی از داده‌ها مانند سری‌های زمانی هستند. برای آموزش مدل، در هر مرحله، دنباله‌هایی از داده‌های آموزش و برچسب آن (خروجی مورد انتظار) به شبکه خوراک می‌شوند؛ اینکه طول هر دنباله ورودی به چه اندازه باشد، به مسأله و داده‌های موجود جهت حل آن بستگی دارد و یک ابرپارامتر است.ابرپارامتر (Hyper Parameter) بودن طول دنباله‌ی ورودی (input)، بدین معنی‌ست که مقدار بهینه از پیش مشخصی ندارد. برای انتخاب مقدار مناسب یک ابرپارامتر می‌توانیم در دوره‌های متوالی آموزش مدل، آن را تغییر داده و نتیجه‌ی این تغییرات را در عملکرد مدل بررسی کنیم.برای درک بهتر فرمت لیست داده‌های ورودی، مثال زیر را در نظر بگیرید. فرض کنید مجموعه‌داده‌ی زیر را در اختیار داریم: x = [1,2,3,4,5,6,7,8,9,10]برای آموزش شبکه عصبی بازگشتی، ورودی‌ها و خروجی‌ها را به‌صورت یک دنباله‌ ورودی و برچسب (خروجی مورد انتظار، در اینجا عنصر بعدی) به شبکه می‌دهیم. مثلا اگر طول دنباله ورودی را یک در نظر بگیریم، در هر مرحله ورودی و برچسب به‌صورت زیر خواهد بود:x  y
1 2
2 3
3 4
4 5
..
9 10در اینجا تنها یک گام‌زمانی (timestep) داشته و تنها از تکرار یک واحد بازگشتی استفاده کردیم. بدین صورت در هر مرحله، از شبکه بازگشتی انتظار داریم با دیدن یک ورودی، خروجی بعدی را پیشنهاد بدهد.همچنین اگر طول را سه در نظر بگیریم، خواهیم داشت:x        y
1,2,3 4
2,3,4 5
3,4,5 6
4,5,6 7
...
7,8,9 10در این حالت سه گام‌زمانی (timestep) داشته و واحد بازگشتی سه بار تکرار شده‌ است؛ دراین‌صورت، در هر مرحله از شبکه بازگشتی انتظار داریم با دیدن دنباله‌ای از سه ورودیِ گذشته، خروجی بعدی را پیش‌بینی کند.طول دنباله ورودی، در واقع نشان‌دهنده‌ی تعداد گام‌های زمانی‌ای است که واحد بازگشتی را تکرار می‌کنیم یا به‌اصطلاح مدل را به این تعداد گام‌زمانی (timestep) باز می‌کنیم.در ادامه‌ی پیاده‌سازی برنامه‌ی پیش‌بینی تابع سینوسی، تعداد گام‌های زمانی را برابر ۱۰ قرار می‌دهیم (متغیر step) و داده‌های آموزش و آزمون را به فرمت مورد انتظارِ شبکه (فرمتی از آرایه‌های ورودی و برچسب آن‌ها که بالاتر توضیح داده شد) در می‌آوریم.اینکه آیا مقدار ۱۰ برای تعداد گام‌های زمانی، مقداری بهینه یا درست است مشخص نیست. شما خود می‌توانید با مقادیر دیگر این شبکه را تست کرده و نتایج را مقایسه کنید.در اینجا برای سهولت ایجاد دنباله‌های ورودی و برچسب هرکدام، تابع کمکی‌ای (helper function) به‌نام convertToDataset نوشته و استفاده شده است:step = 10

# convert into dataset data and label
def convertToDataset(data, step):
    # data = np.append(data, np.repeat(data[-1,], step))
    X, Y = [], []
 for i in range(len(data) - step):
        d = i + step  
        X.append(data[i:d,])
        Y.append(data[d,])
 return np.array(X), np.array(Y)

trainX, trainY = convertToDataset(train, step)
testX, testY   = convertToDataset(test, step)پس در نهایت داده‌های آموزش ما، یعنی trainX و testX لیست‌هایی ۱۰تایی خواهند بود که هر کدام از آن‌ها با نمونه‌ی بعدی در ۹ خانه همپوشانی دارند. (۹ المان از هر دو عنصر متوالی لیست برابر هستند) برای بررسی ابعاد داده‌ها به‌صورت زیر عمل می‌کنیم:print(trainX.shape)
print(testX.shapeنتیجه آن به‌صورت زیر خواهد بود:‎(990, 10)
(490, 10)توجهدقت کنید از آن‌جایی‌که داده‌ها را به‌صورت ۱۰تایی جدا کردیم، تعداد نهایی داده‌ها کمی کمتر می‌شود. چرا که ۱۰ المان اولیه‌ی مجموعه اصلی حذف می‌شوند؛ چون هیچ ۱۰ المانی قبل از آن‌ها وجود ندارد.تغییر ابعاد داده‌ها برای ورودی‌دادن به شبکهپیش از دادن ورودی‌ها به شبکه، نیاز است تا ابعاد آن‌ها به‌صورتی که مورد انتظارِ کتاب‌خانه‌ی Keras است تغییر کند. ورودی شبکه RNN ساده در کتاب‌خانه‌ی کراس به‌صورت زیر است:(NumberOfSequences, TimeSteps, ElementsPerStep)‏NumberOfSequences تعداد داده‌های ورودی (در اینجا ۹۹۰ نمونه). این مورد معادل NumberOfSamples در شبکه‌های تمام‌متصل است.‏TimeStep تعداد گام‌های زمانی در هر ورودی (در اینجا ۱۰). برابر تعداد دفعاتی که شبکه بازگشتی unroll می‌شود.تعداد فیچر‌های هر نمونه (در اینجا ۱ چرا که هر المان تنها یک عدد است).برای تغییر ابعاد نمونه‌های مجموعه‌داده‌های آموزش و آزمون به‌صورت زیر عمل می‌کنیم:# trainX.shape = (990, 1) | testX.shape = (490,, 1)
trainX = np.reshape(trainX, (trainX.shape[0],  trainX.shape[1], 1))
testX = np.reshape(testX, (testX.shape[0],testX.shape[1], 1))بدین‌صورت ابعاد داده‌ها به‌صورت زیر در خواهد آمد که مورد انتظار کتاب‌خانه کراس (Keras) است:‎(990, 10, 1)
‎(490, 10, 1)ساخت مدل (تعیین معماری شبکه و کامپایل آن)در کتاب‌خانه کراس می‌توانستیم مدل‌ها را به‌طریق Sequential یا Model Subclassing و یا توسط Functional API بسازیم. در اینجا به‌دلیل سادگی کار از روش Sequential استفاده می‌کنیم. قطعه کد زیر را ببینید:model = Sequential()
model.add(SimpleRNN(units=64, activation=&amp;quottanh&amp;quot))
model.add(Dense(1))
model.compile(loss=&#039;mean_squared_error&#039;, optimizer=&#039;rmsprop&#039;)پس از تعریف مدل به‌صورت Sequential، یک لایه SimpleRNN به ساختار مدل اضافه می‌کنیم. هر لایه simpleRNN حداقل یک آرگومان units دریافت می‌کند که بیانگر سایز حافظه‌ی نهان لایه بازگشتی بوده (تعداد نورون‌های واحد بازگشتی) و یک ابرپارامتر است.توجهتوجه به این نکته دارای اهمیت است که این آرگومان units با تعداد واحدهای بازگشتی اشتباه گرفته نشود. تعداد واحدهای بازگشتی توسط ساختار داده‌های ورودی تعیین می‌شود؛ همانطور که در بالاتر با استفاده از متغیر step داده‌ها را به فرمت مناسب تغییر دادیم.یادآوریدر جلسه پیش بررسی کردیم که طول حافظه‌نهان (&lt;Hidden State - a&lt;t) یک ابر پارامتر بوده و بیانگر ابعاد خروجی واحد بازگشتی‌ست. این مقدار هرچه بزرگ‌تر باشد به معنی یک واحد بازگشتی پیچیده‌تر خواهد بود.همچنین می‌دانیم این خروجی در هر مرحله بعدی به‌عنوان ورودی به واحد برخواهد گشت. بدین صورت ابعاد ورودی هر واحد بازگشتی، برابر ابعاد ورودی (تعداد فیچرها، اینجا ۱) + ابعاد خروجی (سایز units، اینجا ۶۴) خواهد بود.در ادامه، در لایه simpleRNN به‌عنوان تابع فعال‌ساز (Activation Function) از تابع tanh که جلسه پیش بررسی کردیم استفاده می‌کنیم.نکتهبرای تابع فعال‌ساز، به‌صورت پیش‌فرض نیز (در صورتی که این ورودی تعریف نمی‌شد) همین تابع مورد استفاده لایه بازگشتی قرار می‌گیرد.سپس از آنجایی‌که در هر گام‌زمانی (timestep) می‌خواهیم مقدار تابع سینوس را، که یک عدد واحد است، پیش‌بینی کنیم؛ یک لایه تمام-متصل (Dense) با تنها یک نورون برای تعیین خروجی شبکه اضافه می‌کنیم.یادآوریدر جلسه‌ی پیش دیدیم برای خروجی گرفتن از لایه بازگشتی می‌توانستیم از خروجی واحد بازگشتی (حافظه‌نهان [Hidden State]‌ ارسالی به مرحله بعد) استفاده کنیم و آن را به یک شبکه تمام-متصل با تعداد نورون‌های مورد نیاز متصل کنیم.نکتههمچنین لازم به ذکر است که از آنجایی که این مدل طبقه‌بندی (Classification) انجام نداده و تسک آن رگرسیون (Regression) است، از تابع فعال‌ساز خطی (linear) که پیش‌فرض لایه Dense است استفاده کرده و برای آن هیچ آرگومان activation ای ارسال نکردیم.در نهایت مدل را با استفاده از دستور compile با تعیین تابع زیان mean squared error ( تابع زیانی به‌صورت معمول در تسک‌های رگرسیون استفاده می‌شود) و optimizer تعیین شده کامپایل می‌کنیم.بررسی ساختار مدل (Model summary) - قسمت اولبه‌عنوان یک نکته‌ی جانبی، آیا پس از کامپایل مدل و در مرحله‌ی فعلی می‌توانیم با استفاده از متد model.summary ساختار مدل را بررسی کنیم؟ دانستن این نکته در جلسه‌ی آینده اهمیت خواهد داشت.برای تست این مسأله دستور زیر را اجرا می‌کنیم:model.summary()اگر دستور بالا را (در مرحله فعلی و همگام با این جلسه) اجرا کنید ساختار مدل قابل مشاهده نخواهد بود و اخطاری دریافت خواهیم کرد با این عنوان که یا مدل Build نشده یا سایز ورودی مشخص نیست. بنابراین برای دریافت ساختار مدل نیازمند حداقل اطلاعاتی از ورودی شبکه هستیم.با این‌حال می‌توانیم مدل را روی دیتای خود آموزش داده و fit کنیم.آموزش مدلبرای آموزش مدل روی داده‌های آموزشی که ایجاد کردیم به‌صورت زیر عمل می‌کنیم:history = model.fit(trainX, trainY, epochs=100, batch_size=16, verbose=2)در اینجا داده‌های ورودی فاز آموزش (trainX) و برچسب‌های آن‌ها (trainY) را به مدل معرفی کرده و در ۱۰۰ دوره (Epoch) مدل را آموزش می‌دهیم. برای ورودی دادن به مدل سایز دسته‌ها (Batch Size) را برابر ۱۶ گذاشته و با استفاده از آرگومان verbos = 2 تعیین می‌کنیم اطلاعات مرحله آموزش مدل تا چه اندازه چاپ شود.پس از اجرای این مرحله -که می‌تواند تا چند دقیقه طول بکشد- خروجی زیر را خواهیم داشت. برای سهولت تنها چند دوره (Epoch) آخر را در زیر می‌بینیم:‎...Epoch 95/100
 - 1s - loss: 0.1231
Epoch 96/100
 - 1s - loss: 0.1245
Epoch 97/100
 - 1s - loss: 0.1151
Epoch 98/100
 - 1s - loss: 0.1133
Epoch 99/100
 - 1s - loss: 0.1130
Epoch 100/100
 - 1s - loss: 0.1077همانطور که قابل مشاهده‌ست، مدل در Mini Batch آخر به زیان (Loss) برابر ۰.۱.۷ نزدیک شده.بررسی ساختار مدل (Model summary) - قسمت دومدر قسمت اول بررسی ساختار مدل و پیش از آموزش مدل دیدیم که نمی‌توانیم با استفاده از دستور model.summary ساختار مدل را بررسی کنیم. آیا الان و پس از آموزش می‌توانیم؟ با اجرای دستور زیر این مورد را بررسی می‌کنیم:model.summary()با اجرای متد فوق، توپولوژی شبکه به‌صورت زیر قابل مشاهده خواهد بود:Model: &amp;quotsequential&amp;quot
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
simple_rnn (SimpleRNN)       (None, 64)                4224 
_________________________________________________________________
dense (Dense)                (None, 1)                 65 
=================================================================
Total params: 4,289
Trainable params: 4,289
Non-trainable params: 0
_________________________________________________________________این نکته قابل توجه است که با وجود اینکه در هنگام تعریف لایه‌های شبکه، سایز ورودی‌های مدل را به‌صورت مشخص به مدل ندادیم، اما پس از آموزش مدل و fit کردن، مدل با دریافت ابعاد داده‌های فعلی، قادر است ساختار را تشخیص داده و گزارش دهد.از گزارش فوق مشخص است که به دلیل تعیین نشدن سایز ورودی (Input Shape) این لایه آورده نشده است. در سطر اول مشخص شده یک لایه SimpleRNN به ابعاد نامشخص (None) و ۶۴ داریم که به‌ترتیب نشان‌دهنده‌ی سایز Mini-Batch و سایز بردار حافظه نهان (Hidden State) است. در سطر دوم مشخص شده که در آخر شبکه به یک لایه تمام-متصل به ابعاد نامشخص و ۱ می‌رسد.نکته:در سطر اول، از آنجایی که تعداد فیچر‌های هر داده یک بوده این مقدار در گزارش آورده نشده.بررسی تعداد پارامتر‌های آموزشیتعداد پارامتر‌های قابل آموزش لایه بازگشتی به تعداد نورون‌های واحد بازگشتی (سایز حافظه نهان [Hidden State]) وابسته بوده و به تعداد تکرار واحد بازگشتی ارتباطی ندارد چرا که در واقع یک واحد بازگشتی تکرار شده و وزن‌ها در تکرارهای آن ثابت هستند.در مسئله‌ی ما، ورودی شبکه یک بردار یک عنصری است (هر داده تنها یک فیچر (Feature) داشته و یک عدد بود) و طول واحد بازگشتی برابر ۶۴ است. بنابراین، با توجه به معادلاتی که در جلسه‌ی پیش بررسی کردیم، تعداد پارامتر‌های آموزشی مدل به‌صورت زیر خواهد بود:بررسی تعداد پارامتر‌های آموزشی لایه‌های بازگشتی و تمام-متصل شبکهبنابراین، ۴۲۲۴ پارامتر در لایه بازگشتی (SimpleRNN)‌ و ۶۵ پارامتر برای لایه تمام-متصل (Dense) در اختیار خواهیم داشت.علاوه‌بر ساختار مدل، برای تشخیص ابعاد تنسور (Tensor) ورودی شبکه، می‌توانیم از ویژگی input داخل مدل استفاده کنیم:model.inputکه نتیجه آن به‌صورت زیر قابل مشاهده‌ست:&lt;KerasTensor: shape=(None, 10, 1) dtype=float32 (created by layer &#039;simple_rnn_input&#039;)&gt;که در قسمت shape مشخص شده که ابعاد ورودی به‌صورت نامشخص (تعداد نمونه‌ها [سایز Mini Batch]) در ۱۰ (تعداد گام‌زمانی‌ها) در ۱ (تعداد فیچر‌های هر نمونه) است.در جلسه‌ی آینده در مورد ابعاد ورودی‌های مدل و اجرای مدل برای ابعاد دیگر بحث خواهیم کرد.ارزیابی مدلپس از آموزش مدل روی داده‌های آموزش خود، برای درک بهتری از عملکرد آن، می‌توانیم با رسم نمودار‌هایی مانند نمودار تغییرات زیان (Loss) بر حسب تعداد دوره‌ها (Epoch) و تجسّم پیش‌بینی‌ها در فاز‌های آموزش و آزمون، مدل را بررسی کنیم.رسم نمودار تغییرات زیان (Loss) در طول دوره‌ها (Epochs)برای رسم نمودار تغییرات زبان، با استفاده از کتاب‌خانه matplotlib که در ابتدای نوت‌بوک وارد کرده بودیم، به‌صورت زیر عمل می‌کنیم:loss = history.history[&#039;loss&#039;]
plt.plot(loss, label=&#039;Training loss&#039;)
plt.legend()

plt.show()با اجرا تکه کد بالا، نمودار تغییرات زیان بر حسب دوره‌ها دور طول آموزش مدل قابل مشاهده خواهد بود:همانطور که مشخص است، نمودار تغییرات زیان مدل نزولی بوده و کاهش قابل توجهی داشته.رسم سری‌های اصلی و پیش‌بینی (برای داده‌های آموزش و آزمون)برای بررسی دقیق‌تر نحوه‌ی عملکرد مدل، داده‌های آموزش و آزمون را برای پیش‌بینی به مدل داده و با نتایج مورد انتظار واقعی مقایسه می‌کنیم. برای اینکار همانند قطعه کد زیر، با فراخوانی متد predict مدل و ارسال لیست داده‌های آموزش و آزمون، نتایج پیش‌بینی‌های مدل به ازای هر داده در این لیست‌ها را دریافت کرده و در متغیر‌های مربوطه ذخیره می‌کنیم:trainPredict = model.predict(trainX)
testPredict  = model.predict(testX)به یاد داریم، از ۱۵۰۰ داده‌ای که به‌عنوان محموعه‌داده اصلی خود تولید کردیم، ۱۰۰۰ داده برای فاز آموزش (Train) و ۵۰۰ داده برای فاز آزمون (Test) جدا کرده بودیم، در ادامه برای سهولت رسم نمودار لیست‌های پیش‌بینی‌های بدست آمده را با یکدیگر الحاق (Concat) کرده -تا یک لیست ۱۵۰۰ تایی مشابه مجموعه داده اولیه داشته باشیم- و سپس با استفاده از کتاب‌خانه matplotlib به‌صورت زیر رسم می‌کنیم:Predicted = np.concatenate((trainPredict,testPredict),axis=0)

plt.plot(x)
plt.plot(predicted)
plt.axvline(len(trainX), c=&amp;quotr&amp;quot)
plt.show()در قطعه کد بالا، ابتدا نمودار داده‌های واقعی مسئله (مجموعه داده ساختگی که در ابتدای جلسه ایجاد کردیم [متغیر x]) را با یک رنگ (آبی) در نمودار رسم می‌کنیم. سپس، پیش‌بینی‌های بدست‌ آمده را با رنگی دیگر (نارنجی) به نمودار اضافه و رسم می‌کنیم. در نهایت با استفاده از یک خط عمودی (قرمز رنگ) پیش‌بینی‌های داده‌های آموزش را از داده‌های آزمون جدا کرده و مشخص می‌کنیم.در نتیجه، نمودار پیش‌بینی‌های مدل در مقایسه با داده‌های مجموعه اصلی به‌صورت زیر قابل رسم خواهد بود:انتظار داشتیم، مدل در ۱۰۰۰ داده اول پیش‌بینی شده (Predict) که مربوط به داده‌های آموزش بوده و مدل پیش از این بارها آن‌ها را دریافت کرده عملکردی بی‌نقص داشته باشیم که همانطور که از قسمت سمت چپ خط عمودی قرمز در نمودار فوق مشخص است همین اتفاق افتاده‌ست.همچنین، برای داده‌های تست، همانطور که از قسمت سمت راست خط عمودی قرمز مشخص است، مدل رگرسیون ما توانسته‌است نحوه عملکرد تابع سینوسی را به‌خوبی مدل کند.در این جلسه در ادامه مباحث جلسه‌‌های قبلی، به پیاده‌سازی یک شبکه‌ی عصبی بازگشتی ساده با استفاده از کتاب‌خانه‌ی کراس (Keras) پرداخته، با شبکه‌ی SimpleRNN آن آشنا شده و مدل رگرسیونی برای پیش‌بینی روند یک تابع سینوسی آموزش دادیم. همچنین ساختار شبکه و پارامترهای آن را مورد بررسی قرار دادیم.در جلسه‌ی بعدی به بررسی دقیق‌تر ابعاد ورودی‌های شبکه عصبی و نحوه‌ی استفاده و اجرای مدل برای ابعاد دیگر و گام‌زمانی‌های (timestep) متفاوت بحث خواهیم کرد.می‌توانید لیست جلسات دوره را در این پست مشاهده کنید.جلسه‌ی قبلیجلسه‌ی بعدی (در دست انتشار)این دوره به کوشش علی‌رضا اخوان‌پور به‌صورت ویدئویی تهیه شده و به قلم محمدحسن ستاریان با نظارت ایشان به‌صورت متنی نگارش و توسط بهار برادران افتخاری ویرایش شده‌ست.در صورت تمایل به خرید دوره به صورت ویدئویی می‌توانید با استفاده از کد تخفیف rnn3 از ۲۰ درصد تخفیف بهره‌مند شوید.</description>
                <category>مجموعه دانش‌بنیان شناسا</category>
                <author>مجموعه دانش‌بنیان شناسا</author>
                <pubDate>Mon, 04 Oct 2021 15:59:23 +0330</pubDate>
            </item>
                    <item>
                <title>بینایی کامپیوتر و تفاوت آن با بینایی ماشین</title>
                <link>https://virgool.io/CE-SHAHED-publication/%D8%A8%DB%8C%D9%86%D8%A7%DB%8C%DB%8C-%DA%A9%D8%A7%D9%85%D9%BE%DB%8C%D9%88%D8%AA%D8%B1-%D9%88-%D8%AA%D9%81%D8%A7%D9%88%D8%AA-%D8%A2%D9%86-%D8%A8%D8%A7-%D8%A8%DB%8C%D9%86%D8%A7%DB%8C%DB%8C-%D9%85%D8%A7%D8%B4%DB%8C%D9%86-aoiyb3txe2fj</link>
                <description> بینایی کامپیوتر به مجموعه اقداماتی گفته می‌شود که با هدف ایجاد قابلیت دیدن، درک و توصیف تصاویر دیجیتال برای کامپیوترها، شکل گرفته است. محققان فعال در این حوزه در تلاشند تا مفهوم دیدن را برای کامپیوترها تعریف کنند تا از این طریق بتوانند اطلاعات معنادار را از تصاویر دیجیتال استخراج کنند. به دلیل پیچیدگی و ذات تغییرپذیر جهان پیرامون ما و همچنین شناخت محدود دانشمندان نسبت به سیستم زیستی بینایی انسان، درک بصری و فهم محیط اطراف برای کامپیوترها همواره چالش‌برانگیز بوده است.بینایی کامپیوتر یک حوزه مطالعاتی چندرشته‌ای (multidisciplinary field) است که آن را می‌توان زیرشاخه‌ای از موضوعات هوش‌مصنوعی و یادگیری ماشین درنظر گرفت. برای فعالیت در این حوزه، باید تکنیک‌های مختلف مربوط به طیف وسیعی از رشته‌های مهندسی و علوم کامپیوتر مورد استفاده قرار گیرد. به عنوان مثال یک مسأله خاص ممکن با یک تحلیل آماری ساده حل شود ولی برای یک مسأله دیگر شاید نیاز به استفاده از الگوریتم‌های پیچیده و فراگیر یادگیری ماشین باشد.بینایی کامپیوتر، یک حوزه مطالعاتی چندرشته‌ایهدف بینایی کامپیوتر، شناخت و درک محتوای موجود در تصاویر دیجیتال است. برای رسیدن به چنین هدفی در بینایی کامپیوتر، باید روش‌هایی پیاده‌سازی شود که قابلیت سیستم بینایی انسان را داشته باشد. برای درک محتوای موجود در تصاویر دیجیتال، کامپیوتر باید قادر به توصیف صحیح تصویر و استخراج اطلاعات از آن باشد باشد. این اطلاعات می‌تواند شامل هر نوع موجودیت اطلاعاتی نظیر مدل سه‌بعدی، موقعیت دوربین، تشخیص و بازشناسی اشیاء و دسته‌بندی و جستجوی محتویات تصویر باشد.اهمیت بینایی کامپیوترروزانه در سراسر جهان حجم زیادی محتوای تصویری تولید و جابه‌جا می‌شود. اکثر افراد گوشی همراه هوشمند مجهز به دوربین دارند و از طریق آن عکس و ویدئو می‌گیرند و آن‌ها را در شبکه‌های اجتماعی مانند اینستاگرام و یوتیوب به اشتراک می‌گذارند.محتوای موجود در اینترنت ترکیبی از متن و عکس است. موتورهای جستجو معمولا با پیدا کردن محتوای متنی مشکل چندانی ندارند اما به منظور شناسایی تصاویر نیازمند به الگوریتمی هستند که توانایی درک محتوای موجود در تصاویر و ویدئوها را داشته باشد. برای مدت‌های طولانی، موتورهای جستجو از طریق توضیحاتی که کاربر هنگام آپلود تصویر در اینترنت برای آن می‌نوشت، اقدام به پیدا کردن تصاویر می‌کرد؛ اما امروزه به لطف فناوری بینایی کامپیوتر و پردازش تصویر، موتورهای جستجو قادر خواهند بود تصاویر را از طریق محتوای واقعی موجود در خودشان پیدا کنند.برای این که کامپیوتر اطلاعات کافی از تصاویر استخراج کند، لازم است که توانایی دیدن و درک تصاویر را داشته باشد. این توانایی باید مشابه با ویژگی‌هایی باشد که انسان‌ها از آن برخوردار هستند. سه ویژگی اصلی انسان‌ها در فرآیند دیدن به شرح زیر است:یک شخص قادر است یک تصویر را ببیند و آن را توصیف کند.یک شخص قادر است یک ویدئو را ببیند و خلاصه آن را بیان کند.یک شخص قادر است صورت کسی را که فقط یک بار دیده است را شناسایی کند.این سه مورد، اصلی‌ترین ویژگی‌هایی هستند که در فرآیند بینایی کامپیوتر باید لحاظ شود.تفاوت بینایی کامپیوتر و پردازش تصویربینایی کامپیوتر و پردازش تصویر دو مفهوم متفاوت هستند. پردازش تصویر فرآیند خلق یک تصویر جدید از تصویر موجود از طریق حذف برخی از جزئیات یا افزایش کیفیت آن است. این فرآیند نوعی از پردازش سیگنال‌های دیجیتال است و ارتباطی با درک محتوای موجود در تصویر ندارد. بنابراین تمرکز پردازش تصویر صرفاً بر روی آماده‌سازی یک تصویر خام برای یک هدف مشخص است. مثلا فشرده‌سازی عکس با حذف برخی از جزئیات، بهبود کیفیت عکس با تغییر در رنگ و روشنایی آن و  برش عکس. تمرکز بینایی کامپیوتر بر روی استخراج اطلاعات مهم از عکس یا ویدئو از طریق درک آن همانند مغز انسان است. فرآیندی که در فناوری بینایی ماشین صورت می‌پذیرد به مراتب پیچیده‌تر است.بینایی ماشین (Machine Vision)از طریق فناوری بینایی کامپیوتر می‌توان قابلیت دیدن و تفسیر تصاویر را برای یک ماشین فراهم آورد. برای درک بهتر تفاوت این دو باید به کاربرد آن‌ها توجه کرد. کاربرد بینایی ماشین بیشتر برای مصارف صنعتی است. به بیان دیگر، بینایی ماشین به معنای استفاده از تکنولوژی‌های بینایی کامپیوتر برای حل مساله‌های دنیای واقعی و در صنعت است. مثلا می‌توان از این فناوری در کارخانه‌ها برای مکانیزه ساختن خط تولید محصولات استفاده کرد.درطی ۲۰ سال اخیر سیستم‌های مبتنی بر بینایی ماشین رشد چشمگیری داشته‌اند و به یکی از مهم‌ترین بخش‌ها در کارخانه‌ها و مراکز صنعتی تبدیل شده‌اند. از طریق فناوری بینایی ماشین می‌توان بازدهی در مراکز صنعتی را بالا برد و بدون شک در سال‌های آینده این فناوری جایگاه بالاتری از امروز کسب و خواهد کرد.کاربردهای بینایی ماشینهمان‌طور که گفته شد، بینایی ماشین در حال تبدیل به یک تکنولوژی شناخته شده با هدف افزایش کارایی مراکز صنعتی و کارخانه‌ها است. از طریق این سیستم‌ها می‌توان استفاده از نیروهای انسانی در بخش‌های مختلف را به حداقل رساند و درنتیجه بسیاری از خطاهای انسانی قابل حذف است.به دلیل کاهش خطاهای انسانی، سیستم‌های مبتنی بر بینایی ماشین باعث بهبود کیفیت محصولات می‌شوند و می‌توان با اطمینان زیادی تایید کرد که همه محصولاتی که به دست مشتریان می‌رسید دارای بالاترین میزان کیفیت هستند. این مساله به شدت بر روی کاهش هزینه‌ها تاثیرگذار است.کاربردهای بینایی ماشین را می‌توان در حالت کلی به چهار بخش تقسیم‌بندی کرد:۱. هدایت (Guidance)هدایت اجزاء از طریق بینایی ماشین کاربردهای فراوانی در صنعت دارد. در بیشتر مواقع، این مورد شامل جایگذاری یک قطعه خاص و اطمینان از قرارگیری آن در مکان درست است. درصورت استفاده از بینایی ماشین می‌توان این فرآیند را با کمترین میزان خطا انجام داد. علاوه بر این از تکنیک‌های بینایی ماشین می‌توان برای تعیین مکان و جهت یک قطعه خاص نیز استفاده کرد. این اطلاعات را سپس می‌توان با هدف تولید به ربات‌ها یا ماشین‌های کنترل‌گر منتقل نمود.قابلیت هدایت قطعات از طریق بینایی ماشین، نسبت به روش‌های دستی توسط نیروهای انسانی دقیق‌تر و دارای بازدهی بالاتری است؛ به خصوص در مونتاژ قطعات در خطوط تولید.۲. تشخیص (Identification)تکنیک‌های بینایی ماشین که در برنامه‌های شناسایی استفاده می‌شود بیشتر شامل خواندن بارکد و کدهای ماتریس داده برای شناسایی و دسته‌بندی محصولات مختلف است. این اقدام باعث به حداقل رسیدن خطاهای مرحله تولید و بسته‌بندی محصولات می‌شود. علاوه بر این، سرعت و دقت بسته‌‎بندی محصولات نیز افزایش چشمگیری پیدا می‌کند. با استفاده از فناوری بینایی ماشین بهره‌وری در خط تولید محصولات را می‌توان افزایش داد.تشخیص بارکد در صنعت، نمونه‌ای از کاربردهای بینایی ماشین۳. اندازه‌گیری (Gauging)یکی دیگر از مزایای استفاده از بینایی ماشین در فرآیند تولید محصولات، امکان اندازه‌گیری ابعاد است. معمولا در تولید محصولات صنعتی، ابعاد مقوله بسیار مهمی است؛ زیرا اگر این محصولات دارای ابعاد استانداردی نباشند برای مصارف عملی قابل استفاده نیستند. از طریق بینایی ماشین این مشکل با سرعت و دقت بالایی قابل حل است. در این کاربرد، یک دوربین ثابت در بالای خط تولید تعبیه می‌شود که می‌تواند دو یا چند نقطه بر روی محصولات را تشخیص دهد. درصورتی که فاصله بین این نقاط نسبت به اندازه‌های مجاز متفاوت باشد، محصول از خط تولید خارج می‌شود.بررسی ابعاد اجسام، از کابردهای بینایی ماشین۴. بازرسی و عیب‌یابی (Inspection)مشابه با اندازه‌گیری، قابلیت اندازه‌گیری بینایی ماشین عمدتاً جهت عیب‌یابی در فرآیند خط تولید استفاده می‌شود. برخلاف قابلیت اندازه‌گیری، بازرسی در بینایی ماشین انعطاف‌پذیری بیشتری در تشخیص تعداد زیادی از اشیاء در صنایع مختلف دارد؛ شامل فاسد شدن محصولات در محصولات کشاورزی، نقص در محصولات نساجی و ... . بازرسی بینایی ماشین بسیار سریع‌تر و دقیق‌تر از فرآیند بازرسی دستی است.تفاوت بینایی کامپیوتر و بینایی ماشینبینایی کامپیوتر و بینایی ماشین هر دو تکنولوژی‌های مبتنی بر پردازش تصویر هستند. این فناوری‌ها با تحلیل تصاویر سعی می‌کنند با دقتی نزدیک به دقت چشم انسان، وظایف موردنظرشان را انجام دهند. از آنجایی که بینایی ماشین و بینایی کامپیوتر از جهات مختلف دارای وجه اشتراک فراوانی هستند، برای درک بهتر تفاوت این دو فناوری لازم است کاربردهای آنها را بیان کنیم.معمولاً، مؤلفه‌های ابتدایی لازم برای توسعه سیستم‌های بینایی کامپیوتر و بینایی ماشین مشابه یکدیگر هستند:یک 	دستگاه تصویربرداری یا دریافت تصویر (معمولا یک دوربین که از یک سنسور تصویر و یک لنز تشکیل شده است.)وجود شرایط نوری مناسب برای تعامل با محیط 	عملیاتی، دریافت تصویر از محیط، تحلیل 	تصاویر دریافت شده و تولید خروجی‌های متناسب با تحلیل انجام شدهیک سیستم کامپیوتری (البته در سیستم‌های تصویربرداری امروز نظیر «دوربین‌های هوشمند (Smart 	Cameras) به دلیل وجود پردازنده‌های اختصاصی، بسیاری از فرآیندهای پردازش و تحلیل تصویر درون دستگاه تصویربرداری انجام می‌شود.)برنامه پردازش تصویر (برنامه کاربردی کدنویسی‌شده در زبان‌های برنامه‌نویسی نظیر پایتون، متلب و سایر 	موارد جهت پردازش و تحلیل تصاویر)با توجه به این توضیحات، تفاوت اصلی بینایی کامپیوتر و بینایی ماشین در چیست؟ منظور از بینایی کامپیوتر خودکارسازی ثبت و پردازش تصویر با تمرکز بر روی تحلیل تصاویر است. به عبارت دیگر هدف بینایی کامپیوتر نه تنها دیدن است، بلکه پردازش و فراهم‌سازی نتایج مناسب مبتنی بر مشاهده تصاویر است. منظور از بینایی ماشین استفاده از تکنیک‌های بینایی کامپیوتر در محیط صنعتی به منظور ارتقاء کیفیت و سرعت تولید محصولات است.ابزار توسعهیکی از معروف‌ترین ابزارهای توسعه برنامه‌های بینایی کامپیوتر، بینایی ماشین و پردازش تصویر OpenCV است که در صوت علاقه می‌توانید دوره‌ی ویدیویی آموزشی OpenCV را مشاهده کنید.نویسنده: بنیامین زارعیمنابع:https://machinelearningmastery.com/what-is-computer-vision/https://www.geeksforgeeks.org/difference-between-image-processing-and-computer-vision/https://www.phase1vision.com/blog/4-principal-machine-vision-applicationshttps://qualitastech.com/7-applications-of-machine-vision/</description>
                <category>مجموعه دانش‌بنیان شناسا</category>
                <author>مجموعه دانش‌بنیان شناسا</author>
                <pubDate>Mon, 20 Sep 2021 16:47:20 +0430</pubDate>
            </item>
                    <item>
                <title>تشخیص بیماری کرونا از روی تصاویر سی‌تی‌اسکن و چالش‌های آن</title>
                <link>https://virgool.io/@shenasa/%D8%AA%D8%B4%D8%AE%DB%8C%D8%B5-%D8%A8%DB%8C%D9%85%D8%A7%D8%B1%DB%8C-%DA%A9%D8%B1%D9%88%D9%86%D8%A7-%D8%A7%D8%B2-%D8%B1%D9%88%DB%8C-%D8%AA%D8%B5%D8%A7%D9%88%DB%8C%D8%B1-%D8%B3%DB%8C-%D8%AA%DB%8C-%D8%A7%D8%B3%DA%A9%D9%86-%D9%88-%DA%86%D8%A7%D9%84%D8%B4-%D9%87%D8%A7%DB%8C-%D8%A2%D9%86-rebgcnkzfjjc</link>
                <description>ویروس کرونا 2019 (COVID-19) ناشی از سندرم تنفسی حاد کرونا ویروس 2 (SARS-CoV-2) همچنان تأثیر فوق‌العاده‌ای بر روی بیماران و دستگاه‌های مراقبت‌های بهداشتی در سراسر جهان دارد. در مبارزه با این بیماری جدید، برای اطمینان از قرنطینه به‌موقع و درمان، نیاز جدی به ابزار غربالگری سریع و مؤثر برای شناسایی بیماران آلوده به COVID-19 وجود دارد. در حال حاضر، آزمایش RT-PCR روش اصلی غربالگری COVID-19 است، زیرا می‌تواند اسید ریبونوکلئیک SARS-CoV-2 (RNA) را در نمونه‌های خلط جمع شده از دستگاه تنفسی فوقانی تشخیص دهد. آزمایش RT-PCR یک فرایند زمان‌بر است که در حال حاضر تقاضای زیادی برای آن وجود دارد. این امر منجر به تأخیرهای احتمالی در دستیابی به نتایج آزمون می‌شود.تصویربرداری توموگرافی از قفسه سینه (CT) به دلیل حساسیت بالای آن، به‌عنوان ‌یک ابزار غربالگری جایگزین برای عفونت COVID-19 پیشنهاد شده است و ممکن است در صورت استفاده به‌عنوان مکمل آزمایش RT-PCR، مؤثر باشد. تصویربرداری CT در مراحل اولیه بیماری همه‌گیر COVID-19، به‌ویژه در آسیا، استفاده گسترده‌ای را به دنبال داشت. [1]تصویربرداری CT-scan چیست؟توموگرافی رایانه‌ای (CT) از پرتوهای اشعه ایکس برای به دست آوردن شدت پیکسل‌های سه‌بعدی در بدن انسان استفاده می‌کند. کاتد گرم شده پرتوهای پرانرژی (الکترون) آزاد می‌کند که این خود باعث آزاد شدن انرژی به شکل تابش اشعه X می‌شود. اشعه ایکس از بافت‌های بدن انسان عبور کرده و به یک ردیاب در طرف دیگر برخورد می‌کند. یک بافت متراکم (استخوان‌ها) نسبت به بافت‌های نرم (به‌عنوان‌ مثال چربی) اشعه بیشتری جذب می‌کند. وقتی اشعه ایکس در بدن جذب نمی‌شود (از ناحیه هوا در داخل ریه‌ها عبور می‌کند) و به آشکارساز می‌رسد، آن‌ها را سیاه می‌بینیم. در مقابل، بافت‌های متراکم به رنگ سفید نشان داده‌شده‌اند. به‌این‌ترتیب، تصویربرداری CT می‌تواند تفاوت‌های تراکم را تشخیص داده و یک تصویر سه‌بعدی از بدن ایجاد کند. [2]فرمت فایل‌های CT-scan کلینیکیتصاویر CT-scan که در بیمارستان‌ها گرفته می‌شود دارای فرمت DICOM هستند که مخفف Digital Imaging and Communications in Medicine است. این فرمت یک فرمت استاندارد جهانی است. فایل‌های DICOM علاوه بر تصویر دارای اطلاعات دیگری هستند که به آن‌ها header گفته می‌شود که در آن‌ها اطلاعات مربوط به بیمار، پروتکل‌های تصویربرداری و ... آمده است.ریه یک اندام سه‌بعدی است. دستگاه CT-scan از بالای شانه‌ها شروع به تصویربرداری از مقطع‌های دوبعدی می‌کند و به سمت انتهای ریه (نزدیک شکم) حرکت می‌کند. پس در تصویربرداری از ریه‌ی هر شخص تعدادی فایل DICOM به‌دست می‌آید که مجموع آن‌ها ریه‌ی فرد را نشان می‌دهد.تصاویر مقاطع متفاوت از ریه یک شخصبا توجه به پروتکل‌های محل تصویربرداری، مقاطع تصویربرداری ممکن کم و زیاد شود. هر چه مقاطع بیشتر باشد، تعداد تصاویر بیشتری برای یک شخص ایجاد می‌شود. همان‌طور که گفته شد، در قسمت header، اطلاعات تکمیلی‌ وجود دارد که یکی از آن‌ها شماره slice هر تصویر از بین تصاویر یک شخص است. در فرآیندهای آموزش، اگر نیاز باشد ترتیب تصاویر رعایت شود بهترین کار مرتب کردن داده‌ها بر اساس شماره slice است.فایل‌های DICOM با پسوند .dcm ذخیره می‌شوند. در python کتابخانه‌هایی برای خواندن تصاویر DICOM وجود دارد که چگونگی کار با برخی از آن‌ها را می‌توانید در زیر مشاهده کنید.کتابخانه pydicomimport pydicom
ds = pydicom.dcmread(/path/to/dcm/file)
image_2d = ds.pixel_array.astype(float)کتابخانه medpyfrom medpy.io import load
image_2d, image_header = load(/path/to/dcm/file)میزان جذب اشعه X در تصاویر CT-scan در مقیاس Hounsfield اندازه‌گیری می‌شود. در این مقیاس، شدت اشعه ثبت‌شده برای هوا به ۱۰۰۰- و این مقدار برای آب مقطر به صفر نسبت داده می‌شود. مقادیر برای برخی از بافت‌ها به‌صورت زیر است:مقیاس Hounsfield برای بافت‌های مختلف [2]استخوان‌ها از تراکم بالایی برخوردارند، به همین دلیل مقدار اشعه‌ی ثبت‌شده برای آن‌ها بسیار زیاد است. بیشترین مقادیر متعلق به فلزات است. این اعداد به دلیل وجود نویز ممکن است برای تصاویر واقعی کمی متفاوت باشد.چشم انسان قادر به دیدن ۲۵۶ سطح خاکستری قابل‌تفکیک است، به همین دلیل نمایش تمامی سطوح در مقیاس Hounsfield منطقی نیست. برای حل این مشکل به‌صورت استاندارد محدوده خاصی را با توجه به کاربرد در نظر می‌گیرند. به‌صورت قرارداد، در تصاویر پزشکی برای کاهش دامنه Husenfield یک شدت مرکزی، به نام level و یک پنجره، با نام window تعریف می‌شود. همان‌طور که در شکل زیر مشاهده می‌کنید، برای این کار تنها داده‌هایی که به اندازه window / 2 از level فاصله دارند را مورد بررسی قرار می‌دهند.پنجره با شدت مرکزی level عرض window برای کاربردی خاص [2]در تصویربرداری از ریه به‌صورت استاندارد دو پنجره، متعلق به بافت نرم و بافت ریه در نظر گرفته می‌شود: [2]Chest:    lungs W:1500 L:-600    mediastinum W:350 L:50همان‌طور که گفته شد، بازه تصاویر CT-scan از  ۱۰۰۰- تا ۲۰۰۰+ است. کتابخانه pydicom همه این مقادیر را shift می‌دهد، به‌طوری‌ که مقدار کمینه برابر صفر می‌شود. همچنین تصاویر را به اندازه ۹۰ درجه در جهت ساعتگرد می‌چرخاند.کتابخانه medpy مقادیر را در مقیاس Husenfield حفظ می‌کند. برای این که تصاویر CT-scan به فرم موجود در مجموعه‌داده‌ها دربیاید باید با ترانهاده کردن تصویر خوانده‌شده، چرخش را ایجاد نماییم. در کد زیر نحوه اعمال پنجره مورد نظر و نگاشت و ذخیره سازی آن را به صورت تصویر png می‌بینیم.import numpy as np
import png
from medpy.io import load

image_2d, image_header = load(/path/to/dcm/file)
#  Selecting the lung window
level = -600
window = 1200
max = level + window/2
min = level - window/2
image_2d[image_2d &lt; min] = min
image_2d[image_2d &gt; max] = max
image_2d = image_2d.astype(&amp;quotfloat32&amp;quot)
#  Mapping to [0, 255]
maxx = image_2d.max()
minn = image_2d.min()
image_2d_scaled = ((image_2d - minn) / (maxx - minn)) * 255.0
#  Converting to uint8
image_2d_scaled = np.uint8(image_2d_scaled)
image_2d_scaled = np.squeeze(image_2d_scaled)
image_2d_scaled = np.transpose(image_2d_scaled)
#  Writing png
with open(/path/to/png/file, &#039;wb&#039;) as png_file:
        w = png.Writer(512, 512, greyscale=True)
        w.write(png_file, file2w)پنجره‌های مختلف از یک تصویر در شکل زیر آمده است:تصویر CT-scan با پنجره های فرکانسی متفاوت. الف) بافت نرم (mediastinum) ب) بافت ریه ج) کل بازه انواع ضایعه‌های ریهبه‌طورکلی ضایعات ریه به انواع مختلفی تقسیم می‌شوند که برخی از آن‌ها عبارتند از:ground glass opacitiessolid white consolidationcrazy paving patternشایع‌ترین یافته غیرعادی ground glass opacities است. ریه در حالت طبیعی باید سیاه و دارای رگه‌های سفید واضحی باشد که نشان‌دهنده رگ‌های خونی در ریه هستند. در صورت درگیری ریه با این نوع ضایعه، بعضی از قسمت‌های ریه دارای بخش‌های سایه‌مانند خاکستری می‌شوند. در عفونت‌های شدیدتر، مایعات بیشتری در لوب‌های ریه جمع شده، بنابراین بخش‌های سایه‌مانند خاکستری به solid white consolidation تبدیل می‌شوند. سرانجام، یافته‌ای به نام crazy paving pattern به دلیل تورم فضای بین بافتی در امتداد دیواره‌های ریه به وجود می‌آید. [3]انواع ضایعات شایع در بیماری COVID-19 در تصاویر سی‌تی‌اسکن [3]یافته‌ها نشان می‌دهد که CT قفسه سینه به ضایعات COVID-19 بسیار حساس است؛ اما  solid white consolidation و crazy paving pattern، در بقیه علل ذات‌الریه ویروسی مثل آنفولانزا و آدنو ویروس هم دیده می‌شوند. این ضایعات حتی در انواع مختلف بیماری‌های غیرعفونی هم دیده می‌شوند. [3]تعریف مساله در دنیای واقعیپس از آشنایی با تصاویر CT-Scan می‌خواهیم به بررسی این مساله در دنیای واقعی بپردازیم. در پروژه واقعی نیاز است که با توجه به سری تصاویر برای هر شخص، تعیین شود که فرد مبتلا به COVID است یا خیر. هم‌چنین مساله‌های دیگری از جمله تشخیص میزان پیشرفت بیماری و قطعه‌بندی ضایعه نیز قابل تعریف است. در ادامه، برخی از مواردی که دانستن آن‌ها به حل مساله کمک می‌کند را بررسی می‌کنیم.انواع فرمت‌های تصاویر CT-scan در مجموعه داده‌هافایل‌های NifTiواژه NifTi مخفف Neuroimaging Informatics Technology Initiative است که نوعی قالب پرونده برای تصویربرداری عصبی است. پرونده‌های NifTi به‌طورمعمول در انفورماتیک تصویربرداری برای تحقیقات علوم اعصاب و حتی نورورادیولوژی مورد استفاده قرار می‌گیرند. همان‌طور که گفته شد فرمت استاندارد مراقبت‌های بالینی، پرونده‌های DICOM هستند. با این‌ حال، برخی از ابزارهای انفورماتیک تصویربرداری می‌توانند پرونده‌های DICOM را به‌صورت خودکار به قالب NifTi تبدیل کنند. فایل‌های NifTi با پسوند .nii ذخیره می‌شوند. [4]فایل‌های pngهمه ما با تصاویر png آشنا هستیم. هر دو فرمت dcm و nii قابل‌ تبدیل به png هستند. برای این کار کافی است که به بازه ۰ تا ۲۵۵ نگاشته شوند. با ترفندهایی می‌توان png را نیز به DICOM و NifTi تبدیل کرد ولی این کار با از د‌ست رفتن اطلاعات همراه است که ممکن است جزئیات حائز اهمیتی باشند. هم‌چنین این کار باعث از دست رفتن اطلاعات header نیز می‌شود.بررسی مجموعه داده‌های موجود و چالش‌های کار با آن‌هامجموعه داده‌های بسیاری از هر سه فرمت گفته شده در این زمینه وجود دارند که در ادامه به چالش‌های کار با هر کدام از آن‌ها می‌پردازیم:داده‌های pngدر اکثر این داده‌ها نحوه‌ی تبدیل تصاویر از فرمت اصلی و بازه انتخاب‌شده مشخص نیست. این مسئله تکرارپذیری را دشوار می‌کند. اگر مدلی را بر روی این داده‌ها آموزش دهیم، برای تست روی داده‌های واقعی ابتدا باید فایل‌های DICOM را به png تبدیل کنیم که با توجه به نامشخص بودن نحوه تبدیل، دقت افت خواهد کرد.در این داده‌ها تصاویر ابتدایی و انتهایی ریه وجود ندارد، یعنی فقط ریه‌های باز موجود است. در مسائل واقعی و موارد کلینیکی قرار است که از کل تصاویر ریه شخص تصمیم گرفته شود که شخص دارای COVID است یا خیر. اگر مدل با این داده‌ها آموزش داده شود، چون موارد ریه بسته در training set نیست، در زمان تست واقعی، ریه‌های بسته توسط مدل اشتباه تشخیص داده می‌شود و دقت کل مدل افت می‌کند. برای حل این مشکل، ساده‌ترین راهکار حذف تصاویر ابتدایی و انتهایی ریه در هنگام تست است که البته در حالت‌هایی که COVID خفیف باشد و صرفاً در slice های ابتدایی و انتهایی، ضایعه دیده شود، باعث افت دقت خواهد شد؛ اما با مطالعات انجام‌شده احتمال بروز این حالت چندان زیاد نیست.در این داده‌ها اکثراً فقط موارد شدید ضایعه COVID وجود دارد. اگر مدل با این داده‌ها آموزش داده شود، در زمان تست برای موارد خفیف، دقت پایینی خواهد داشت.در برخی از این داده‌ها جدا کردن train set ،validation set و test set به درستی انجام‌ نشده است. به‌طور مثال slice شماره ۱۰ از یک بیمار در train set و slice شماره ۱۱ در مجموعه داده‌های تست قرار دارد که data leakage محسوب می‌شود و باعث افزایش دقت به‌طور کاذب روی این مجموعه‌ داده به‌خصوص می‌شود؛ درحالی‌که روی یک test set دیگر به‌شدت افت خواهد کرد.داده‌های NifTiاز آن‌جایی‌که فایل‌های NifTi هم در مقیاس Husenfield هستند مشکل تبدیل کردن را ندارند. هم‌چنین با توجه به این که این داده‌ها سه‌بعدی هستند، کل ریه را شامل می‌شوند و مشکل حذف ریه‌های بسته در آن‌ها وجود ندارد. همین‌طور مشکل جدا کردن train set و test set و یا data leakage هم پیش نمی‌آید.بعضی  از مجموعه داده‌ها در این فرمت، میزان شدت بیماری را هم label زده‌اند، مثل دیتاست mosmed[5] که case های سالم، case های تا ۲۵٪ درگیر ضایعه، بین ۲۵٪ تا ۵۰٪ درگیر، بین ۵۰٪ تا ۷۵٪ درگیر و بالای ۷۵٪ درگیر را جدا کرده‌اند. البته این کلاس‌ها imbalanced هستند. از معایب کار با این مجموعه داده‌ها می‌توان به نیازمندی به سخت‌افزار قوی و زمان‌بر بودن آموزش اشاره کرد.داده‌های DICOMاین مجموعه‌داده‌ها، نمونه‌های جمع‌آوری‌شده در بیمارستان‌ها هستند که تمامی فایل‌های DICOM هر شخص را در یک folder قرار می‌دهند.مشکل این مجموعه‌داده‌ها این است که اکثراً folder‌ها برچسب‌گذاری شده‌اند و برچسب هر فایل DICOM مشخص نیست. باید توجه داشت که در مواردی که شخص COVID دارد نیز slice هایی وجود دارد که در آن‌ها ضایعه دیده نمی‌شود.در این مطلب با تعریف مساله تشخیص بیماری کرونا از روی تصاویر سی‌تی‌اسکن با استفاده از هوش مصنوعی آشنا شدیم. هم‌چنین انواع داده‌های موجود برای حل این مساله را بررسی کردیم؛ اما باید توجه داشت که در مسیر حل این مساله چالش‌های متفاوتی وجود دارد، مانند این که در مجموعه داده‌های عمومی، طبقه‌بندی با توجه به هر slice صورت می‌گیرد؛ در صورتی که در دنیای واقعی نیاز است نتیجه برای دنباله‌ای از تصاویر که به یک شخص تعلق دارند تعیین شود. هم‌چنین تعداد slice هایی که درگیری با کرونا را نشان می‌دهند، با توجه به مقدار پیشرفت بیماری متفاوت است و تعیین حد آستانه مناسب نیازمند آزمایش‌های متعدد است. imbalanced بودن مجموعه داده‌های موجود نیز بر پیچیدگی‌های مساله اضافه می‌کند. هم‌چنین باید این نکته را نیز در نظر داشت که در واقعیت طبقه‌بندی case های دارای ضایعه‌ی خفیف با case های سالم بسیار دشوار است.نویسنده: فاطمه جباری، بهار برادران افتخاری[1] Jin, C., Chen, W., Cao, Y., Xu, Z., Tan, Z., Zhang, X., ... &amp; Feng, J. (2020). Development and evaluation of an artificial intelligence system for COVID-19 diagnosis. Nature communications, 11(1), 1-14.[2] https://theaisummer.com/medical-image-python/[3] https://www.osmosis.org/learn/Imaging_features_of_COVID19_(LifeBridge_Health)[4] https://radiopaedia.org/articles/nifti-file-format[5] https://www.medrxiv.org/content/10.1101/2020.05.20.20100362v1</description>
                <category>مجموعه دانش‌بنیان شناسا</category>
                <author>مجموعه دانش‌بنیان شناسا</author>
                <pubDate>Tue, 31 Aug 2021 16:28:41 +0430</pubDate>
            </item>
                    <item>
                <title>مقدمه‌ای بر شبکه‌های عصبی بازگشتی (RNNs) - جلسهٔ دوم</title>
                <link>https://virgool.io/@shenasa/%D9%85%D9%82%D8%AF%D9%85%D9%87-%D8%A7%DB%8C-%D8%A8%D8%B1-%D8%B4%D8%A8%DA%A9%D9%87-%D9%87%D8%A7%DB%8C-%D8%B9%D8%B5%D8%A8%DB%8C-%D8%A8%D8%A7%D8%B2%DA%AF%D8%B4%D8%AA%DB%8C-rnn-%D8%AC%D9%84%D8%B3%D9%87-%D8%AF%D9%88%D9%85-hbczutmh2ofw</link>
                <description>در جلسه دوم از دوره‌ی «مقدمه‌ای بر شبکه‌های عصبی بازگشتی (RNN)» به بررسی دقیق‌تر اجزای تشکیل دهنده این شبکه‌ها یعنی واحد‌های بازگشتی و معادلات آن‌ها می‌پردازیم.تطبیق با دوره ویدئوییقسمت دوم (۲۱ دقیقه) – یک سلول (واحد) بازگشتی ساده و شبکه بازگشتیمروردر جلسه اول دوره، با ماهیت و انواع شبکه‌های عصبی بازگشتی آشنا شده و فهمیدیم شبکه‌های RNN برای پردازش توالی‌ها و الگوهای متشکل از چندین مرحله استفاده می‌شوند. همچنین با استفاده از یک مثال ساده چراغ راهنمایی تفاوت این شبکه‌ها با شبکه‌های غیر بازگشتی را بررسی کردیم.یک سلول/واحد بازگشتیشمایی کلی از یک واحد بازگشتی و ورودی‌ها، خروجی و تابع فعال‌سازدر شبکه‌های عصبی بازگشتی ورودی هر مرحله متشکل از دو قسمت است، یک ورودی مستقل از داده جاری همانند دیگر شبکه‌ها (عموما یک داده ترتیبی یا سری زمانی) و یک ورودی از خروجی مرحله‌ی قبل به‌عنوان حافظه‌ی نهان (Hidden State) که انتظار می‌رود مدل در این حافظه نهان، ویژگی‌هایی از داده‌های پردازش شده تا این مرحله را کد کرده و همانند یک حافظه نگه‌داری کند.برای مثال در پروسه پردازش یک ویدیو، ورودی‌های هر مرحله، فریم جاری ویدیو و Hidden State (خروجی) مرحله قبل بوده و خروجی هر مرحله یک بردار Hidden State است که در واقع انتظار می‌رود اینکه تا این مرحله از ویدیو چه چیزی را دیده‌است کد کرده و نگه‌داری کند.توجه به این نکته حائز اهمیت است که با وجود اینکه در این جلسات اولیه آموزش و در توضیح شبکه‌های عصبی بازگشتی و پردازش توالی داده‌ها تنها به این مورد اشاره می‌کنیم که شبکه از نتایج پردازش داده‌های قبلی برای تولید حافظه موقت خود استفاده می‌کند، اما شبکه‌های عصبی بازگشتی لزوما منحصر به این شرط نبوده و می‌توانند با روش‌های مختلفی از داده‌های بعدی (داده‌هایی که در آینده پردازش خواهند شد) نیز برای تولید حافظه استفاده کنند. این ویژگی به‌خصوص در پردازش‌های زبان طبیعی و ترجمه‌های ماشینی اهمیت داشته و استفاده می‌شوند.پردازش واحدبه‌صورت کامل‌تر، سلول‌ها یا واحدهای بازگشتی اجزای تشکیل‌دهنده‌ای هستند که با تکرار آن‌ها (در طول دنباله‌‌ی داده‌های در حال پردازش) تشکیل یک شبکه عصبی بازگشتی می‌دهند. هر واحد بازگشتی متشکل از دو ورودی و یک خروجی به‌همراه وزن‌ها (Weights) و بایاس‌های (Biases) هرکدام است.هر کدام از ورودی‌ها در وزن مربوطه خود ضرب شده و سپس به یکدیگر الحاق (Concatenate) شده (در کنار هم قرار گرفته) و به تابع فعال‌ساز (Activation Function) داده می‌شوند؛ نتیجه‌ی اعمال این تابع فعال‌ساز، خروجی واحدی خواهد بود که به‌عنوان حافظه‌ی نهان (Hidden State) شناخته شده و در مرحله بعد به‌همراه ورودی استفاده می‌شود.ورودی‌ها می‌توانند ابتدا به هم الحاق شده و سپس در یک وزن ضرب شوند. در ادامه در این مورد بحث خواهیم کرد.اینکه تابع فعال‌ساز چه تابعی‌ست و چگونه اعمال می‌شود را نیز بحث می‌کنیم.جابه‌جایی مقادیر بین مراحل اجرای سلول بازگشتیابعاد حافظه نهان (Hidden State)طول بردار حافظه نهان (Hidden State) ثابت نبوده و خود یک ابر پارامتر (Hyper Parameter) است و همانند باقی ابر پارامترها با یک بردار مقادیر تصادفی (Random) و یا بردار صفر (برداری که تمام المان‌هایش صفر هستند) مقداردهی اولیه می‌شود.مدل ذهنیبرای درک درست نحوه‌ی کار شبکه‌های عصبی بازگشتی، نیاز است تا ساختار و مدل ذهنی (Mental Model) درستی از واحد‌های بازگشتی و نحوه قرارگیری و استفاده آن‌ها داشته باشیم که البته در طول دوره و با یادگیری جزئیات بیشتر این مدل ذهنی را توسعه می‌دهیم.توجه کنید که هرچند که به این اجزای سازنده‌ی شبکه‌های بازگشتی، سلول نیز گفته می‌شود، تصور و برداشت از آن‌ها نباید محدود به یک واحد پردازش ساده باشد؛ برای مثال، در تصویر زیر مقایسه‌ای از یک شبکه‌ی تمام-متصل و یک شبکه‌ی بازگشتی معادل را مشاهده می‌کنید که در آن گره‌ها در لایه‌های مختلف یک شبکه‌ی عصبی، فشرده شده و تشکیل یک واحد عصبی بازگشتی می‌دهند [۱]:یک شبکه عصبی تمام-متصل در مقابل یک شبکه عصبی بازگشتیتوالی و باز کردن واحدهادر نمایش، شبکه‌های بازگشتی معمولاً به‌صورت یک واحد بازگشتی که Hidden State خروجی آن به Hidden State ورودی متصل است، مصور می‌شود. در مقابل می‌توان این شبکه را در طول زمان باز کرده (unroll) و آن را به‌صورت دفعات اجرای مختلف نمایش داد که در هر مرحله، ورودی مربوط به Hidden State آن مرحله، از Hidden State خروجی مرحله‌ی قبل استفاده شده است [۲].شمایی از شبکه عصبی بازگشتی باز (Unroll) شدهمشخص است در هر مرحله از اجرای شبکه، یک واحد یکسان (یک شبکه یکسان) استفاده می‌شود. این بدین معنی است که وزن‌ها و بایاس‌های مورد استفاده واحد بازگشتی در هر بار اجرا بروزرسانی می‌شوند.خروجی واحدخروجی گرفتن از واحد بازگشتیبرای خروجی گرفتن از شبکه، یک انشعاب از Hidden State خروجی هر سلول جدا می‌کنیم. این انشعاب در ادامه بسته به‌نوع مسئله به یک شبکه دیگر متصل می‌شود. برای مثال، برای یک وظیفه (Task) طبقه‌بندی چند-کلاسه خروجی هر واحد به یک شبکه تمام-متصل با تابع فعال‌ساز بیشینه هموار (Softmax) متصل خواهد شد.تابع فعال‌سازدر شبکه‌های ساده عصبی بازگشتی معمولا از تابع tanh (تانژانت هذلولی) به‌عنوان تابع فعال‌ساز استفاده می‌شود. tanh تابعی سیگموئید (Sigmoid) بوده تمامی مقادیر ورودی را بین -۱ تا ۱ نگاشت می‌کند. این تابع به‌صورت زیر تعریف می‌شود و نمودار آن قابل رسم است [۲]:نمودار و فرمول تابع tanhویژگی این تابع این است که تمامی ورودی‌ها در بازه ثابتی نگاشت شده و این امکان را می‌دهد تا ورودی‌های بزرگ خیلی پراهمیت و ورودی‌های کوچک خیلی کم‌اهمیت نشوند. در واقع نسبت تاثیر ورودی‌ها را متعادل کرده و باعث بهبود عملکرد مدل می‌شود.همچنین دلیل دیگر استفاده از این تابع، پشتیبانی فریم‌ورک‌های یادگیری ماشین و امکان اجرای این تابع روی GPU برای بهبود سرعت و بازدهی‌ست. استفاده از تابع‌های دیگر ممکن است باعث شوند که اجرای شبکه بازگشتی روی CPU انجام شده و با کندی سرعت مواجه شویم.نشانه‌گذاری و معادلاتقواعد نشانه‌گذاری معادلات واحد بازگشتی می‌توانیم روابط ریاضی میان ورودی و خروجی‌های یک سلول بازگشتی را به‌صورت ضرب‌های ماتریسی فرمول‌بندی کنیم. در این آموزش برای راحتی و سازگاری از قواعد نشانه‌گذاری (notation) پروفسور Andrew Ng استفاده می‌کنیم. در این نشانه‌گذاری علائم به‌صورت زیر تعریف می‌شوند:‏x بردار ورودی واحد‏^y بردار خروجی واحد‏a بردار حافظه نهان یا Hidden State‏w ماتریس وزنبرای مثال، شبکه عصبی بازگشتی ساده‌ای به‌صورت باز (unroll) شده زیر در نظر بگیرید:نمایشی از شبکه عصبی بازگشتی باز (Unroll) شده به همراه ورودی/خروجی‌ها و وزن‌هادر این شبکه، ورودی سلول در هر مرحله (&lt;x&lt;t) در وزن Wax (وزن تولیدکننده a و ضرب‌شونده در x) و Hidden State هر مرحله (&lt;a&lt;t) نیز در وزن Waa (وزن تولیدکننده a و ضرب شونده در a) ضرب می‌شوند. سپس از الحاق نتایج این دو ضرب و اعمال تابع فعال‌سازی (G1 [tanh]) بر آن، Hidden State جدید تولید می‌شود. در ادامه، می‌توان برای گرفتن خروجی، Hidden State به‌دست آمده را در یک وزن Wya (وزن تولیدکننده y و ضرب‌شونده در a) ضرب کرد.معادلات اولیهبا توجه به توضیحات بالا، می‌توان این ضرب‌های ماتریسی را به‌صورت معادلات زیر خلاصه کرد:معادله حافظه نهان (Hidden State) هر مرحلهمعادله حافظه نهان (Hidden State) واحد بازگشتیمطابق این معادله، Hidden State در هر مرحله برابر است با اعمال یک تابع فعال‌ساز مانند G1 بر حاصل جمع، ضرب ورودی و Hidden State مرحله قبل، بر وزن‌هایشان و باباس.معادله خروجی هر مرحلهمعادله خروجی واحد بازگشتیخروجی نیز برابر اعمال تابع فعال‌ساز دیگری (G2) بر حاصل‌جمع، ضرب Hidden State محاسبه‌شده مرحله جاری در وزن مربوطه و بایاس خواهد بود.برای تعیین خروجی، تابع فعال‌ساز انتخاب شده بسته به مسئله متفاوت خواهد بود. برای مثال می‌توانیم برای مسائل دو کلاسه یک نورون و یک تابع سیگموید، برای مسائل چند کلاسه، تابع بیشینه هموار (Softmax) و برای مسائل رگرسیون (Regression) از یک تابع خطی (Linear) استفاده کنیم.لازم به توجه است، در تمامی مراحل اجرای این شبکه بازگشتی، وزن‌هایی که به‌روزرسانی می‌شوند یکسان هستند. یعنی Wax استفاده شده در تمام مراحل استفاده و به‌روزرسانی می‌شود و بایاس‌های مورد استفاده در تمامی مراحل یکسان است.معادلات ساده‌شدهبرای ساده‌ترکردن محاسبات و قواعد نشانه‌گذاری، می‌توان بردارهای ورودی و Hidden State را الحاق کرده و تنها از یک وزن با نام Wa برای آن استفاده کنیم. طبیعی است دراین‌صورت ابعاد این ماتریس وزن تغییر کرده و برابر با [طول ورودی, طول حافظه نهان] خواهد بود. همچنین برای وزن تشکیل دهنده خروجی نیز از نام Wy استفاده می‌کنیم.این معادلات ساده‌ شده، همگام با مطالب آینده‌ی دوره و شبکه‌های LSTM و GRU که در ادامه بررسی خواهیم کرد بوده و باعث سازگاری بهتر خواهند شد.معادلات ساده شده واحد بازگشتینحوه انجام الحاق‌هابرای بررسی ابعاد بردارها و ماتریس‌های هر واحد، مثال زیر را در نظر بگیرید:فرض‌کنید می‌خواهیم مدلی برای پردازش کلمات بسازیم؛ می‌دانیم که طول حافظه نهان (Hidden State) ما یک ابر پارامتر بوده و اختیاری‌ست، در این مثال برای آن مقدار ۱۰۰ المان را در نظر می‌گیریم. اما، بردار ورودی‌ها به مسئله وابسته بوده و در این مثال یک بردار وان هات (One Hot) مثلا یک دیکشنری از کلمات و برداری به طول ۱۰۰۰۰ المان را در اختیار داریم.از آنجایی که خروجی هر مرحله یک بردار ۱۰۰تایی خواهد بود (چون طول بردارِ Hidden State را برابر ۱۰۰ در نظر گرفتیم)، در این صورت طول ماتریس‌های وزن‌ Waa و Wax به‌صورت زیر خواهند بود:الحاق بردارهای a و xبردارهای ورودی هر مرحله و حافظه نهان (Hidden State) را به‌صورت عمودی به یکدیگر الحاق می‌کنیم تا در نهایت یک بردار از مجموعه طول‌های آن‌ها (در مثال ما ۱۰۱۰۰ المان) داشته باشیم:الحاق ماتریس‌های Wax و Waaهمچنین، ماتریس‌های وزن‌های مربوط به ورودی هر مرحله و حافظه نهان (Hidden State)، یعنی به‌ترتیب Wax و Waa را به‌صورت افقی به یکدیگر الحاق می‌کنیم تا در نهایت یک ماتریس به ابعادِ [طول ورودی, طول حافظه نهان] (در مثال ما [۱۰۱۰۰, ۱۰۰]) داشته باشیم:در این جلسه در ادامه مباحث جلسه‌ی قبل، به بررسی دقیق‌تری از واحدهای بازگشتی، اجزای اصلی تشکیل‌دهنده شبکه‌های عصبی بازگشتی پرداختیم و فهمیدیم ورودی‌ها و خروجی‌های هر واحد چیست و چگونه تشکیل می‌شود، به‌علاوه با معادلات ماتریسی آن‌ها آشنا شده و قواعد نشانه‌گذاری استاندارد آن را مرور کردیم.در جلسه‌ی بعدی یک شبکه عصبی بازگشتی ساده برای تخمین یک تابع سینوسی پیاده‌سازی می‌کنیم.در جلسات آینده برای پیاده‌سازی‌ها از زبان پایتون و کتابخانه‌ی Keras استفاده می‌کنیم. اگر با این کتابخانه یا کتابخانه‌‌های دیگری مثل numpy یا Matplotlib آشنایی ندارید، تا جلسه‌ی آینده فرصت خوبیست مرور کلی‌ای بر آن‌ها داشته باشید.می‌توانید لیست جلسات دوره را در این پست مشاهده کنید.جلسه‌ی قبلیجلسه‌ی بعدیاین دوره به کوشش علی‌رضا اخوان‌پور به‌صورت ویدئویی تهیه شده و به قلم محمدحسن ستاریان با نظارت ایشان به‌صورت متنی نگارش و توسط بهار برادران افتخاری ویرایش شده‌ست.در صورت تمایل به خرید دوره به صورت ویدئویی می‌توانید با استفاده از کد تخفیف shenasablog_rnn2 از ۲۰ درصد تخفیف بهره‌مند شوید.منابعدر انتهای هر پاراگراف این پست شماره‌ی منبع یا منابعی که در نگارش آن قسمت از آن‌ها کمک گرفته شده ذکر شده، در لیست زیر می‌توانید هر کدام از این منابع را مشاهده و مطالعه کنید:[۱] آموزش‌های simplilearn[۲] آموزش‌های IBM Cloud</description>
                <category>مجموعه دانش‌بنیان شناسا</category>
                <author>مجموعه دانش‌بنیان شناسا</author>
                <pubDate>Sun, 22 Aug 2021 11:23:03 +0430</pubDate>
            </item>
                    <item>
                <title>پدیده بیش‌برازش (Overfitting) و راهکارهای مقابله با آن</title>
                <link>https://virgool.io/@shenasa/%D9%BE%D8%AF%DB%8C%D8%AF%D9%87-%D8%A8%DB%8C%D8%B4-%D8%A8%D8%B1%D8%A7%D8%B2%D8%B4-overfitting-%D9%88-%D8%B1%D8%A7%D9%87%DA%A9%D8%A7%D8%B1%D9%87%D8%A7%DB%8C-%D9%85%D9%82%D8%A7%D8%A8%D9%84%D9%87-%D8%A8%D8%A7-%D8%A2%D9%86-ze2s9ohiog5x</link>
                <description>فلوچارت بررسی وضعیت مدلهمان‌طور که می‌دانید ساختن یک مدل یادگیری ماشین فقط تغذیه‌ی داده‌ها نیست، بلکه عوامل بسیاری وجود دارند که بر دقت هر مدل تأثیر‌ می‌گذارند. به عنوان مثال، در دنیای واقعی هرگز یک مجموعه داده تمیز و کامل نخواهیم داشت. هر مجموعه داده دارای برخی قسمت‌های عجیب و غریب، مفقود شده و یا داده‌های نامتعادل است. با توجه به هدف الگوریتم‌های یادگیری ماشین، ممکن است مدل برای به دست آوردن الگوی موجود در داده‌ها به صورت دقیق، مجبور باشد نویزهای موجود در داده را در خود جای دهد. در نتیجه، مدل به دست آمده به خوبی با داده های آموزش متناسب خواهد ‌بود اما به اندازه کافی برای تشخیص نمونه های دیگر که در روند مدل‌سازی وارد نشده‌اند، قدرت تعمیم نخواهد داشت.هدف یک مدل یادگیری ماشین خوب این است که بتواند پس از یادگیری داده‌های موجود در مجموعه داده آموزش، به هر مجموعه داده‌ای از حوزه مشابه تعمیم یابد. این ویژگی به ما این امکان را می‌دهد تا بتوانیم برای مجموعه داده‌هایی که مدل هرگز ندیده است عملیات پیش بینی را انجام دهیم. بنابراین، تعمیم پذیری مدل آموزش داده شده در فریند یادگیری حائز اهمیت زیادی می‌باشد.در آمار از اصطلاح fit بودن به عنوان میزان نزدیکی مقدار پیش‌بینی‌شده ‌توسط مدل به کلاس هدف یا مقدار واقعی استفاده می‌شود. وقتی یک مدل بیش از نیاز واقعی با داده fit شود، شروع به سازگاری خود با داده‌های پرت و مقادیر نادرست می‌کند. در این حالت به اصطلاح گفته می‌شود مدل overfit شده است. در نتیجه‌ی این پدیده، کارایی و دقت مدل کاهش می‌یابد.در ادامه قبل از بررسی دقیق‌تر پدیده‌ی overfitting به تفاوت بین سیگنال و نویز می‌پردازیم تا درک بهتری از نحوه‌ی یادگیری درست مدل داشته باشیم.سیگنال در مقابل نویزدر مدل‌سازی، شما می‌توانید «سیگنال» را به عنوان الگوی زیربنایی واقعی که می‌خواهید از داده‌ها بیاموزید، تصور کنید. در مقابل، «نویز» به اطلاعات بی‌ربط یا تصادفی در یک مجموعه داده اشاره دارد. برای درک مفهوم نویز و سیگنال، مثالی از زندگی واقعی را بررسی می‌کنیم.فرض کنید می‌خواهیم رابطه بین سن و سواد را در میان بزرگسالان مدل کنیم. اگر قسمت بسیار زیادی از جمعیت را به عنوان نمونه درنظر بگیریم، یک رابطه واضح بین سن و سواد پیدا خواهیم کرد که این همان سیگنال است. در‌صورتی که اگر همین کار را در مورد یک جمعیت محلی انجام دهیم، ممکن است رابطه موجود بین داده‌ها به درستی مشخص نشود؛ زیرا ممکن است تحت تأثیر داده‌های پرت و تصادفی قرار گیرد. به عنوان مثال، یک بزرگسال زودتر به مدرسه رفته یا برخی از بزرگسالان توانایی تحصیل نداشتند و ...نویز با سیگنال تداخل پیدا می‌کند. این‌جاست که الگوریتم‌های یادگیری ماشین وارد می‌شوند. یک الگوریتم با عملکرد خوب می‌تواند سیگنال را از نویز جدا کند. اگر الگوریتم مورد استفاده بیش از حد پیچیده یا انعطاف‌پذیر باشد (مثلا دارای ویژگی های ورودی زیادی باشد یا به طور مناسب تنظیم نشده باشد)، در نهایت به جای پیدا کردن سیگنال، نویزها را به خاطر می‌سپارد. مدلی که نویز را به جای سیگنال آموخته است، overfit یا بیش‌برازش‌شده در نظر گرفته می‌شود؛ زیرا با مجموعه داده آموزشی fit است اما با مجموعه داده‌های جدید و دیده‌نشده تناسب چندانی ندارد.مقایسه مدل overfit شده با مدل استانداردبه عنوان مثال در مجموعه داده‌های نشان داده شده در شکل، خط قرمز نمایانگر یک مدل overfit شده و خط سیاه نشان دهنده یک مدل fit شده است. گرچه خط قرمز به بهترین وجه داده‌های آموزشی را دنبال می‌کند، اما بیش از اندازه به آن داده‌ها وابسته است و احتمالاً در مقایسه با خط سیاه، میزان خطای بالاتری در داده‌های جدید و دیده‌نشده خواهد داشت.مقایسه Overfitting و Underfittingقبل از این که بیشتر در زمینه overfitting صحبت کنیم، نگاهی به مفهوم underfitting می‌اندازیم. هنگامی که ما یک مدل را آموزش می‌دهیم، سعی می‌کنیم چهارچوبی را ایجاد کنیم که بتواند ماهیت یا کلاس اقلام موجود در مجموعه‌داده را بر اساس ویژگی‌هایی که آن موارد را توصیف می‌کنند، پیش‌بینی کند. یک مدل باید بتواند یک الگو را در یک مجموعه داده توضیح دهد و داده‌های آینده را بر اساس این الگو پیش‌بینی کند. هر چه مدل رابطه بین ویژگی‌های مجموعه‌ی آموزشی را بهتر توضیح دهد، مدل ما از تناسب بیشتری برخوردار است  و به اصطلاح fit  است.مدلی که رابطه‌ی بین ویژگی‌های داده‌های آموزشی را ضعیف توضیح دهد و در نتیجه نتواند نمونه داده‌ها را به طور دقیق طبقه‌بندی کند، دچار underfitting  روی داده‌های آموزشی است. underfitting اغلب در هنگام تلاش برای طراحی یک مدل خطی با داده‌های غیر خطی رخ می‌دهد. هم‌چنین زمانی که داده‌های کافی برای ایجاد یک مدل دقیق وجود نداشته باشد نیز underfit شدن مدل وجود دارد. داده‌های آموزشی بیشتر یا ویژگی‌های بیشتر اغلب به کاهش underfitting کمک می‌کنند.بنابراین چرا ما مدلی را ایجاد نمی‌کنیم که تمام داده‌های آموزش را توضیح دهد؟ مگر هدف نهایی کسب بهترین دقت نیست؟ باید توجه کنیم ایجاد مدلی که الگوهای داده‌های آموزشی را به خوبی فرا گرفته باشد، چیزی است که باعث overfitting می‌شود. مجموعه داده‌های آموزشی و مجموعه داده‌هایی که مدل‌ بعدا بر روی آن‌ها تست می‌شود دقیقاً یکسان نخواهند بود اما با وجود تفاوت‌ها، ویژگی‌های کلیدی یکسانی نیز خواهند داشت. بنابراین، طراحی مدلی که مجموعه داده‌های آموزشی را کاملاً توضیح دهد به این معنی است که شما رابطه بین ویژگی‌هایی که به مجموعه داده‌های دیگر نیز به خوبی تعمیم می‌یابد را به دست آورده‌اید. در ادامه با بررسی یک مثال تلاش می‌کنیم تا این موضوع مشخص‌تر شود.مثالی از Overfittingدر این مثال overfitting و underfitting را بررسی می‌کنیم و این که چگونه می‌توان از رگرسیون خطی با ویژگی‌های چندجمله‌ای برای تقریب توابع غیرخطی استفاده کرد. نمودار نارنجی تابعی را نشان می‌دهد که می‌خواهیم تقریب بزنیم و این تابع بخشی از تابع کسینوس می‌باشد. علاوه بر این‌، نمونه‌های تابع اصلی و تقریب مدل‌های مختلف نیز نمایش داده شده است. مدل‌ها دارای ویژگی‌های چندجمله‌ای از درجات مختلف هستند.import numpy as np
import matplotlib.pyplot as plt
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import cross_val_score

def true_fun(X):
        return np.cos(1.5 * np.pi *X)

np.random.seed(0)
n_samples = 30
degrees =[1, 4, 15]
X = np.sort(np.random.rand(n_samples))
y = true_fun(X) + np.random.randn(n_samples) * 0.1
plt.figure(figsize=(14, 5))

for i in range(len(degrees)):
        ax = plt.subplot(1, len(degrees), i + 1)
        plt.setp(ax, xticks=(), yticks=())
        polynomial_features = PolynomialFeatures(degree=degrees[i], include_bias=False)
        linear_regression = LinearRegression()
        pipeline = Pipeline([(&amp;quotpolynomial_features&amp;quot, polynomial_features), (&amp;quotlinear_regression&amp;quot, linear_regression)])
        pipeline.fit(X[:, np.newaxis], y)

        # Evaluate the models using cross validation
        scores = cross_val_score(pipeline, X[:, np.newaxis], y, scoring=&amp;quotneg_mean_squared_error&amp;quot, cv=10)
        X_test = np.linspace(0, 1, 100)
        plt.plot(X_test, pipeline.predict(X_test[:, np.newaxis]), label=&amp;quotModel&amp;quot)
        plt.plot(X_test, true_fun(X_test), label=&amp;quotTrue function&amp;quot)
        plt.scatter(X, y, edgecolor=&#039;b&#039;, s=20, label=&amp;quotSamples&amp;quot)
        plt.xlabel(&amp;quotx&amp;quot)
        plt.ylabel(&amp;quoty&amp;quot)
        plt.xlim((0, 1))
        plt.ylim((-2, 2))
        plt.legend(loc=&amp;quotbest&amp;quot)
        plt.title(&amp;quotDegree {}\nMSE = {:.2e}(+/- {:.2e})&amp;quot.format(degrees[i], -scores.mean(), scores.std()))

plt.show()می‌بینیم که یک تابع خطی (چند جمله ای با درجه ۱) برای fit شدن با نمونه‌های آموزشی کافی نیست. این حالت همان underfitting است. چندجمله‌ای درجه ۴ تقریباً تابع اصلی را تقریب می‌زند. با این حال، برای درجات بالاتر، مدل دچار حالت overfitting روی داده‌های آموزشی می‌شود؛ یعنی نویز داده‌های آموزشی را می‌آموزد.دلایل وقوع Overfitting:علل این پدیده ممکن است پیچیده باشد اما به طور کلی، می‌توانیم آن‌ها را به سه نوع دسته‌بندی کنیم:۱. یادگیری نویز در مجموعه آموزشهمان طور که پیش‌تر بحث شد، هنگامی که مجموعه آموزشی از نظر اندازه خیلی کوچک باشد، یا دارای اطلاعات نمایانگر کمتری باشد، یا نویز زیادی داشته باشد، این وضعیت باعث می‌شود که نویزها و داده‌های پرت شانس زیادی برای یادگیری داشته باشند و بعداً به عنوان مبنای پیش‌بینی‌ها عمل کنند. بنابراین، یک الگوریتم با عملکرد خوب باید بتواند داده‌های نماینده را از نویز تشخیص دهد.۲. پیچیدگی مدلدر تعیین میزان پیچیدگی یک مدل مفهومی به نام تعادل بین واریانس و بایاس مطرح می‌شود که به تعادل بین دقت و سازگاری اشاره دارد. وقتی الگوریتم‌ها ورودی‌های بسیار زیاد دارند، مدل به طور متوسط با سازگاری کم‌تری دقیق‌تر می شود. این وضعیت به این معنی است که مدل‌ها می‌توانند در مجموعه داده‌های مختلف به شدت متفاوت عمل کنند. در ادامه به بررسی این دو مفهوم و ارتباط آن‌ها با پیچیدگی مدل می‌پردازیم.واریانس (Variance) و بایاس (Bias) هر دو شکل‌های مختلفی از خطای پیش بینی در یادگیری ماشین هستند. سازش بین واریانس و بایاس زیاد (Bias Variance Trade-off) مفهوم بسیار مهمی در آمار و یادگیری ماشین است که بر تمام الگوریتم‌های تحت نظارت یادگیری ماشین تأثیر می‌گذارد. این trade-off  تأثیر بسزایی در تعیین پیچیدگی و overfitting برای هر مدل یادگیری ماشین دارد.بایاس (Bias)بایاس تفاوت بین پیش‌بینی‌های مورد انتظار از مدل شما و مقادیر واقعی است. تصور کنید که یک مدل رگرسیون خطی را به مجموعه داده‌ای که دارای الگوی غیر خطی است، fit کنید:مدل با بایاس بالاهر چقدر هم مشاهدات بیشتر جمع‌آوری کنید، یک رگرسیون خطی نمی‌تواند منحنی‌های موجود در آن داده‌ها را مدل‌سازی کند. این همان پدیده‌ای‌ست که به عنوان underfitting شناخته می‌شود.واریانس (Variance)واریانس به حساسیت الگوریتم شما نسبت به مجموعه خاصی از داده‌های آموزشی اشاره دارد. الگوریتم‌هایی با واریانس بالا بسته به مجموعه‌ی آموزش، مدل‌های بسیار متفاوتی تولید خواهند کرد.مدل با واریانس بالاالگوریتمی را در نظر بگیرید که باعث برازش مدلی بدون محدودیت و فوق العاده انعطاف پذیر در همان مجموعه داده بالا می‌شود. همان‌طور که می‌بینید، این مدل بدون محدودیت، مجموعه آموزشی را با تمام نویزها حفظ کرده است که این پدیده همان overfitting می‌باشد.تعادل بین واریانس و بایاسالگوریتم‌های بایاس بالا-واریانس کم پیچیدگی کمتری دارند و دارای ساختاری ساده ولی غیرمنعطف هستند. آن‌ها مدل‌های سازگار، اما به طور متوسط با دقت کم را آموزش خواهند داد؛ مانند الگوریتم‌های خطی یا پارامتریک مثل رگرسیون، Naive Bayes و …الگوریتم‌های بایاس کم-واریانس بالا ساختار پیچیده‌تر و در عین حال انعطاف‌پذیر دارند. آن‌ها مدل‌هایی را آموزش می‌دهند که به طور متوسط ناسازگار اما دقیق هستند؛ مانند الگوریتم‌های غیرخطی یا غیرپارامتری مثل درخت تصمیم، نزدیک‌ترین همسایه و ...وجود trade-off بین بایاس و واریانس مشخص‌کننده‌ی میزان پیچیدگی مدل است؛ زیرا یک الگوریتم نمی‌تواند هم‌زمان هم پیچیده و هم ساده باشد.برای برخی از حالات، ممکن است مقدار هر دو خطا در بعضی از الگوریتم‌ها کم‌تر از بقیه‌ی خطاها باشند. به عنوان مثال، روش‌های گروهی (Ensebmle) مانند جنگل تصادفی (Random Forest) اغلب در عمل بهتر از سایر الگوریتم‌ها عمل می‌کنند. توصیه ما این است که همیشه برای هر مساله‌ای چندین الگوریتم معقول را امتحان کنید.برای ساختن یک مدل پیش‌بینی‌کننده خوب، باید تعادلی بین بایاس و واریانس پیدا کرد که خطای کل را به حداقل برساند. در نتیجه، این تعادل مطلوب منجر به مدلی می‌شود که نه overfit  و نه underfit شده باشد که این همان هدف نهایی یادگیری ماشین تحت نظارت است، یعنی جدا کردن سیگنال از مجموعه داده در حالی که نویز را نادیده می‌گیرد.مدل با تعادل بین بایاس و واریانس۳. روش‌های مقایسه‌ای که در الگوریتم‌های هوش مصنوعی به صورت فراگیر وجود دارنددر طی این فرآیندها، ما همواره چندین آیتم را بر اساس نمرات یک تابع ارزیابی مقایسه می‌کنیم و آیتمی با حداکثر امتیاز را انتخاب می‌کنیم. با این حال، این فرآیند احتمالاً آیتم‌هایی را انتخاب می‌کند که هیچ تاثیری در بهبود دقت طبقه‌بندی‌کننده نداشته و یا حتی باعث کاهش دقت طبقه‌بندی می‌شوند.روش‌های تشخیص بیش‌برازشیک چالش کلیدی که در تشخیص هر نوع برازش (مانند overfitting ،fit و underfitting) وجود دارد این است که قبل از تست کردن داده‌ها تشخیص آن تقریباً غیرممکن است. این مورد به ویژگی‌های ذاتی overfitting که ناتوانی در تعمیم مجموعه داده است اشاره دارد. بنابراین می‌توان داده‌ها را به زیرمجموعه‌های مختلف تفکیک کرد تا آموزش و آزمایش آسان شود. داده‌ها به دو بخش اصلی تقسیم می‌شوند، یعنی مجموعه داده آزمایشی و مجموعه داده آموزشی.تکنیک تقسیم ممکن است بر اساس نوع مجموعه داده متفاوت باشد و می‌توان از هر نوع تکنیک تقسیم استفاده کرد. اگر مدل در مجموعه داده‌های آموزش بسیار بهتر از مجموعه داده‌های آزمایش عمل می‌کند، به احتمال زیاد مدل overfit شده است؛ برای مثال، فرض کنید مدل با دقت ۹۹٪ روی مجموعه داده آموزش عمل می‌کند، 	اما دقت آن روی مجموعه داده آزمایش تنها ۵۰-۵۵٪ است. این 	مدل overfit است و قابلیت تعمیم‌پذیری ندارد. اگر مدل در مجموعه داده‌های آزمایش بهتر از مجموعه داده‌های آموزش عمل کند یا به صورت کلی بر روی داده‌های آموزش دقت خوبی نداشته باشد، به احتمال زیاد دچار underfitting شده است.اگر مدل در هر دو مجموعه داده‌های آموزش و آزمایش خوب عمل کند، مدل بهترین تناسب را دارد؛ به 	عنوان مثال، مدل ما دقت ۹۰٪ روی مجموعه آموزش و دقت ۸۸-۹۲٪ روی مجموعه داده آزمایشی دارد. در 	این حالت این مدل fit شده است و مناسب مساله است.اگرچه تشخیص overfitting موثر است، اما مشکل را حل نمی‌کند. چندین تکنیک برای جلوگیری از این پدیده وجود دارد که در ادامه آن‌ها را بررسی می‌کنیم.روش‌های جلوگیری از overfittingبرای جلوگیری از overfitting، راوش‌های مختلفی وجود دارد که در ادامه چند مورد از آن‌ها بررسی می‌شوند.۱. استفاده از Cross-validationاین روش یک اقدام پیشگیرانه قوی در برابر overfitting است. برای این کار از داده‌های اولیه آموزشی چند بخش کوچک آموزش - تست ایجاد می‌شود از این تقسیم‌ها برای تنظیم مدل استفاده می‌شود. در K-fold cross-validation، داده‌ها به k زیرمجموعه تقسیم می‌شوند که هر کدام از آن‌ها یک fold نامیده می‌شوند. سپس، به طور مکرر الگوریتم را بر روی k-1 fold  آموزش داده می‌شود و از یک fold باقی‌مانده به عنوان مجموعه آزمایش (که «holdout fold» نامیده می‌شود) استفاده می‌شود.K-ford cross-validationاعتبارسنجی متقابل به شما این امکان را می‌دهد که هایپرپارامترها را فقط با مجموعه آموزشی اصلی تنظیم کنید و مجموعه آزمایش را برای انتخاب مدل نهایی خود به عنوان یک مجموعه داده واقعاً دیده نشده نگه دارید.۲. گسترش داده‌های آموزشیدر یادگیری ماشین، الگوریتم تنها عاملی نیست که بر دقت طبقه‌بندی نهایی تأثیر می‌گذارد. کیفیت و کمیت مجموعه داده‌های آموزشی در بسیاری از موارد، به ویژه در زمینه یادگیری تحت نظارت، به طور قابل توجهی بر دقت نهایی تاثیر می‌گذارند. آموزش مدل در واقع فرآیند تنظیم پارامترهای آن است. پارامترهای تنظیم شده به خوبی از اثر overfitting و همچنین underfitting جلوگیری می‌کنند. برای تنظیم این پارامترها، مدل برای یادگیری به نمونه‌های کافی نیاز دارد. مقدار نمونه‌ها متناسب با تعداد پارامترها است و هرچه مدل پیچیده‌تر باشد، پارامترهای بیشتری باید تنظیم شوند. به عبارت دیگر، یک مجموعه داده‌ی گسترده می‌تواند دقت پیش‌بینی را به ویژه در مدل‌های پیچیده تا حد زیادی بهبود دهد.اگر امکان جمع‌آوری داده‌های بیشتر نبود، می‌توان مجموعه داده‌های موجود را متنوع‌تر جلوه داد. به همین دلیل است که داده‌افزایی (Data Augmentation) به طور گسترده به عنوان یک استراتژی کلی برای بهبود عملکرد قدرت تعمیم مدل‌ها در بسیاری از زمینه‌ها، مانند تشخیص الگو و پردازش تصویر مورد استفاده قرار می گیرد.با این حال، افزایش حجم داده‌ها زمان آموزش را افزایش می‌دهد. علاوه بر این، دستیابی به داده‌های آموزشی می‌تواند گران یا دشوار باشد؛ زیرا به مداخله انسانی زیادی مانند برچسب زدن نیاز دارد.به طور خلاصه، عمدتا چهار رویکرد برای گسترش مجموعه آموزش وجود دارد:۱) داده‌های آموزشی بیشتری جمع‌آوری کنید.۲) مقداری نویز تصادفی به مجموعه داده‌ی موجود اضافه کنید.۳) مقداری از داده‌ها را از مجموعه داده های موجود به وسیله برخی پردازش‌ها تغییر دهید.۴) برخی از داده‌های جدید را بر اساس توزیع مجموعه داده‌های موجود تولید کنید.۳. کاهش پیچیدگی مدلبیش‌برازش مدل می‌تواند به دلیل پیچیدگی یک مدل اتفاق بیفتد، به گونه‌ای که حتی با وجود حجم زیادی از داده‌ها، مدل هنوز هم روی مجموعه داده آموزشی overfit شود. کاهش پیچیدگی مدل می‌تواند از بیش‌برازش آن جلوگیری کند.برخی از اقدامات قابل اجرا شامل هرس درخت تصمیم یا کاهش تعداد پارامترها و استفاده از dropout در شبکه‌های عصبی است. ساده‌سازی مدل هم‌چنین می‌تواند مدل را سبک‌تر و سریع‌تر کند.۴. حذف ویژگی‌هااگرچه برخی از الگوریتم‌ها دارای انتخاب خودکار ویژگی‌ها هستند، برای تعداد قابل توجهی از الگوریتم‌ها که این ویژگی را ندارند، حذف چند ویژگی نامربوط به صورت دستی از ورودی‌های مدل می‌تواند تعمیم آن را بهبود بخشد. یکی از راه‌های انجام این کار، نتیجه‌گیری در مورد چگونگی fit شدن آن ویژگی در مدل است. این کار کاملاً شبیه اشکال زدایی کد به صورت خط به خط است. اگر ویژگی‌ای نتواند ارتباط داده‌ها را در مدل توضیح دهد، می‌توانیم آن ویژگی را شناسایی کنیم. در کل بهتر است از چند روش انتخاب ویژگی برای یک نقطه شروع مناسب استفاده شود.۵. توقف زودهنگاموقتی یک الگوریتم یادگیری را به صورت مکرر آموزش می‌دهید، می‌توانید نحوه‌ی عملکرد مدل را در هر مرحله ارزیابی کنید. تا تعداد مشخصی از تکرارها، مدل روندی رو بهبود دارد و دقت در هر تکرار افزایش می‌یابد. با این حال، پس از نقطه‌ای، توانایی مدل در تعمیم ضعیف می‌شود زیرا شروع به بیش‌برازش بر روی داده‌های آموزشی می‌کند. توقف زودهنگام به توقف روند آموزش قبل از گذشت مدل از آن نقطه اشاره می‌کند.تعیین نقطه مناسب توقف زودهنگامامروزه این تکنیک بیشتر در یادگیری عمیق استفاده می‌شود؛ در حالی که سایر تکنیک‌ها (به عنوان مثال regularization یا نظم‌دهی) برای یادگیری ماشین کلاسیک ترجیح داده می‌شوند.۶. نظم‌دهی (Regularization)به طور کلی، خروجی یک مدل می‌تواند تحت تأثیر چندین ویژگی قرار گیرد. با افزایش تعداد ویژگی‌ها مدل پیچیده‌تر می‌شود. یک مدل overfit شده تمایل دارد همه‌ی ویژگی‌ها را برای ایجاد خروجی در نظر بگیرد، حتی اگر برخی از آن‌ها تأثیر بسیار محدودی بر خروجی نهایی داشته باشند، و یا حتی اگر برخی از آن‌ها نویزهایی باشند که برای خروجی بی‌معنی هستند.جهت محدود کردن این موارد، دو نوع راه حل وجود دارد:آ) فقط ویژگی‌های مفید را انتخاب کرده و ویژگی‌های غیرمفید را از مدل خود حذف کنیم.ب) وزن ویژگی‌هایی را که تأثیر کمی بر طبقه‌بندی نهایی دارند، به حداقل برسانیم. به عبارت دیگر نیاز داریم که  اثر ویژگی‌های بی‌فایده را محدود کنیم. اما تشخیص ویژگی‌های بی‌فایده همیشه کار ساده‌ای نیست، بنابراین سعی می‌شود با به حداقل رساندن تابع هزینه، همه آن‌ها را محدود کنیم.برای انجام این کار، یک پنالتی به نام regularizer به تابع هزینه اضافه می‌شود که در فرمول زیر نشان داده شده است:regularizerدر این فرمول‌ها ?(?; ?, ?) تابع هزینه‌ی اصلی، ? وزن، ? مجموعه داده‌ی آموزش، ? مقادیر واقعی یا مقادیر لیبل ها، ? تعداد اعضای مجموعه آموزش، ? ضریب regularization و ?Ω(?)  همان پنالتی اعمال شده می‌باشد.در این جا می‌توانیم از متد  گرادیان کاهشی برای پیدا کردن مجموعه وزن‌ها استفاده کنیم:چگونگی اعمال regularizerبا توجه به فرمول های بالا در می یابیم که هرچه اندازه ? بیشتر شود میزان پنالتی کاهش می‌یابد. به عبارت دیگر، هرچه مجموعه‌ی آموزش بزرگ‌تر باشد، خطر بیش‌برازش و اثر regularization کم‌تر خواهد بود.روش‌های مختلفی برای regularizaton وجود دارد که بسته به نوع یادگیری مورد استفاده می‌توان از آن‌ها استفاده کرد. انتخاب روش نظم‌دهی نیز اغلب یک هایپرپارامتر است، به این معنی که می‌توان آن را از طریق cross-validation تنظیم کرد.۷. کلاس بندی جمعی (Ensembling)گروه‌بندی یا Ensembling یکی از روش‌های یادگیری ماشین است که  پیش‌بینی ها را از چندین مدل جداگانه با هم ادغام می‌کند. چندین روش مختلف برای کلاس بندی جمعی وجود دارد، اما دو روش رایج‌تر آن عبارتند از bagging و boosting.در پایان باید گفت که بیش‌برازش یا overfitting یک مساله کلی در یادگیری ماشین تحت نظارت است که نمی‌توان به طور کامل از آن اجتناب کرد. این امر می‌تواند به دلیل محدودیت اندازه داده‌های آموزشی یا نویزی بودن داده‌ها باشد. هم‌چنین این اتفاق می‌تواند به خاطر پیچیدگی الگوریتم‌ها و نیاز آن‌ها به تنظیم پارامترهای زیاد باشد؛ اما در پاسخ به اتفاق، الگوریتم‌های متنوعی برای کاهش اثر برازش استفاده می‌شود که در این پست برخی از آن‌ها را بررسی کردیم.تهیه و تنظیم: ریحانه زهرابیمنابع:1. https://elitedatascience.com/overfitting-in-machine-learning2. https://elitedatascience.com/bias-variance-tradeoff3. https://datascience.foundation/sciencewhitepaper/underfitting-and-overfitting-in-machine-learning4. https://iopscience.iop.org/article/10.1088/1742-6596/1168/2/0220225. https://colab.research.google.com/drive/1XzngJPT8WUyHFW-JxhrawVhPurJlv1cA?usp=sharing#scrollTo=KRy9FCybl4Km</description>
                <category>مجموعه دانش‌بنیان شناسا</category>
                <author>مجموعه دانش‌بنیان شناسا</author>
                <pubDate>Sat, 07 Aug 2021 18:00:54 +0430</pubDate>
            </item>
                    <item>
                <title>آشنایی با انواع روش‌های داده‌افزایی در تصاویر</title>
                <link>https://virgool.io/@shenasa/%D8%A2%D8%B4%D9%86%D8%A7%DB%8C%DB%8C-%D8%A8%D8%A7-%D8%A7%D9%86%D9%88%D8%A7%D8%B9-%D8%B1%D9%88%D8%B4-%D9%87%D8%A7%DB%8C-%D8%AF%D8%A7%D8%AF%D9%87-%D8%A7%D9%81%D8%B2%D8%A7%DB%8C%DB%8C-%D8%AF%D8%B1-%D8%AA%D8%B5%D8%A7%D9%88%DB%8C%D8%B1-ecofp1rkixz8</link>
                <description>همان‌طور که می‌دانید، اکثر سیستم‌های بینایی کامپیوتر با افزایش حجم داده‌ها، عملکرد بهتری خواهند داشت؛ اما در خیلی از مواقع جمع‌آوری داده‌ی بیشتر کاری سخت و پرهزینه است. بنابراین، data augmentation یا داده‌افزایی یکی از تکنیک‌هایی است که اغلب برای بهبود بازدهی سیستم‌های بینایی کامپیوتر به کار گرفته می‌شود.  مهم نیست که از transfer learning استفاده می‌کنید و یا در حال train کردن مدل خود هستید،  معمولا data augmentation  کمک زیادی می‌کند. توجه داشته باشید که این امر در تمامی کاربردهای یادگیری ماشین صدق نمی‌کند اما در اکثر مساله‌های بینایی کامپیوتر با کمبود داده مواجه می‌شویم و از این رو نیاز به Data Augmentation در این حوزه احساس می‌شود.تکنیک Data augmentation با تولید تصاویر جدید به طور مصنوعی از تصاویر اصلی به ما کمک می‌کند تا تصاویر جدیدی برای آموزش داشته باشیم. این کار در هر کاربرد و دامنه‌ای از شبکه‌های یادگیری عمیق روش‌های مخصوص به خود را دارد؛ مثلاً در یادگیری تشخیص گفتار انسانی، کمی نویز به سیگنال صوت اضافه می‌کنیم تا شبکه تشخیص کلمات یا احساسات را حتی با صداهای غیرشفاف نیز یاد بگیرد. اما در مساله‌های تشخیص وجود شئ در تصویر یا پیدا کردن دقیق جای چند شئ در یک تصویر، تکنیک‌های دیگری مثل چرخش و تغییر روشنایی و بریدن تصویر استفاده می‌شود.آموزش شبکه‌های عصبی مصنوعی عمیق با داده‌های بیشتر می‌تواند به داشتن شبکه‌های قوی تر منتهی شود؛ و تکنیک‌های Image data augmentation می‌توانند گونه‌هایی از تصاویر را بسازند که شبکه بتواند با یادگیری خصوصیات جدیدی از آن‌ تصاویر - علاوه بر تصاویر اصلی - قدرت درک گستره بیشتری از هر شئ داشته باشد و یا به اصطلاح Generalized باشد.شاید بتوان گفت که Image data augmentation شناخته‌شده‌ترین نوع data augmentation است که شامل ساخت نسخه‌های دگرگون‌شده از تصاویر است که همچنان به کلاس و توزیع آماری تصاویر اصلی تعلق دارند. هدف data augmentation افزایش اندازه مجموعه با استفاده از تصاویر جدیدی است که محتمل و باور کردنی باشند. پس مشخص است که انتخاب تکنیک data augmentation به کار رفته باید با دقت و مطابق با محتوای دیتاست و نوع مسئله انجام شود.می توانید در این زمینه به آزمایش و خطا هم بپردازید. به این شکل که بخش کوچکی از تصاویر آموزش را با شبکه‌ای کوچک آموزش دهید و در این آموزش از تنظیم‌های مختلفی برای تولید تصاویر جدید استفاده کنید. در این روند لازم است بهبود یا عدم بهبود شبکه را به طور مداوم در نظر داشته باشید.حال می‌خواهیم که نگاهی به تکنیک‌های متفاوت image data augmentation بیندازیم. برای راحتی کار، از کلاس ImageDataGenerator در کتابخانه keras  استفاده می‌کنیم. تکنیک‌های بسیار زیادی برای این کار وجود دارد که ما در این‌جا تعدادی از معروف‌ترین آن‌ها را مثال می‌زنیم. برای بررسی نتیجه این روش‌ها از عکس زیر استفاده می‌کنیم.تصویر نمونهبرای شروع، از کلاس ImageDataGenerator یک شیٔ ایجاد می‌‌کنیم. تنظیمات چگونگی و شدت انواع مختلف augmetation ها را می‌توان از طریق آرگومان‌ها به کلاس سازنده اطلاع داد.datagen = ImageDataGenerator()بعد از ساخته شدن این شئ، می‌توانیم با آن یک iterator از یک دیتاست تصویر بسازیم تا در حین فرآیند آموزش به صورت دسته ای یا batch based تصاویر تولید شده را در هر iteration به شبکه دهد.تکنیک شیفت عمودی و افقی تصاویراین کار به معنای هل دادن تمامی پیکسل‌های تصویر در یک جهت مشخص است، مثل شیفت عمودی و افقی و قطری. در حین این عمل اندازه تصویر ثابت می‌ماند. این به این معنی است که تعدادی از پیکسل‌ها از تصویر خارج و حذف می‌شوند و در بخشی از تصویر باید برای پیکسل‌ها مقداری جدید مشخص شود. با کمک آرگومان های width_shift_range  و height_shift_range در تابع سازنده ImageDataGenerator می‌توان ضمن فعال‌سازی این شیفت‌ها، بازه‌ی ممکن برای شیفت احتمالی افقی و عمودی هر تصویر را مشخص کرد.این آرگومان‌ها می‌توانند مقدارهای اعشاری در قالب یک عدد یا آرایه‌ای از اعداد را بگیرند. اگر ورودی یک عدد کوچک‌تر از ۱ باشد، کسری از تصویر را نشان می‌دهد که می‌تواند شیفت بخورد و اگر بیشتر از یک باشد، تعداد پیکسل‌ها را مشخص می‌کنند. هم‌چنین اگر به جای یک عدد آرایه ای از اعداد ارسال شود، بازه‌ی ممکن برای انتخاب تصادفی میزان شیفت پیکسل‌ها را مشخص می کند. توضیحات زیر در سایت رسمی Keras نوع و مقادیر آرگومان‌ها را توضیح می‌دهد.width_shift_range: Float, 1-D array-like or int - float: fraction of total width, if &lt; 1, or pixels if &gt;= 1. - 1-D array-like: random elements from the array. - int: integer number of pixels from interval (-width_shift_range, +width_shift_range) - With width_shift_range=2 possible values are integers [-1, 0, +1], same as with width_shift_range=[-1, 0, +1], while with width_shift_range=1.0 possible values are floats in the interval [-1.0, +1.0).height_shift_range: Float, 1-D array-like or int - float: fraction of total height, if &lt; 1, or pixels if &gt;= 1. - 1-D array-like: random elements from the array. - int: integer number of pixels from interval (-height_shift_range, +height_shift_range) - With height_shift_range=2 possible values are integers [-1, 0, +1], same as with height_shift_range=[-1, 0, +1], while with height_shift_range=1.0 possible values are floats in the interval [-1.0, +1.0).مثال زیر نشان می دهد که یک شیفت افقی با مقداردهی width_shift_range بین [۴۰۰، ۴۰۰-] چطور نوشته می‌شود و خروجی آن به چه شکل است.from numpy import expand_dims
from keras.preprocessing.image import load_img
from keras.preprocessing.image import img_to_array
from keras.preprocessing.image import ImageDataGenerator
from matplotlib import pyplot
#  load the image
img = load_img(&#039;cat.jpg&#039;)
#  convert to numpy array
data = img_to_array(img)
#  expand dimension to one sample
samples = expand_dims(data, 0)
#  create image data augmentation generator
datagen = ImageDataGenerator(width_shift_range=[-400, 400])
#  prepare iterator
it = datagen.flow(samples, batch_size=1)
#  generate samples and plot
for i in range(9):
        #  define subplot
        pyplot.subplot(330 + 1 + i)
        #  generate batch of images
        batch = it.next()
        #  convert to unsigned integers for viewing
        image = batch[0].astype(&#039;uint8&#039;)
        #  plot raw pixel data
        pyplot.imshow(image)
#  show the figure
pyplot.show()اجرای مثال بالا موجب می‌شود که یک شئ از ImageDataGenerator با پیکربندی مشخص‌شده ساخته شود و پس از تعیین اندازه دسته تصاویر و ساخت یک iterator، تصاویر مختلف تولید کنید. گرفتن تصویر و نمایش آن در حلقه‌ای با ۹ تکرار انجام شده که به این ترتیب ۹ تصویر متفاوت داریم. نتیجه شیفت افقی بر روی تصویردر ادامه همین مثال برای ایجاد شیفت‌های عمودی آرگومان  height_shift_range را با مقدار ۰.۵ مقداردهی می‌کنیم که یعنی تصویر می‌تواند تا ۵۰ درصد به بالا یا پایین شیفت بخورد.#  load the image
img = load_img(&#039;cat.jpg&#039;)
#  convert to numpy array
data = img_to_array(img)
#  expand dimension to one sample
samples = expand_dims(data, 0)
#  create image data augmentation generator
datagen = ImageDataGenerator(height_shift_range=0.3)
# prepare iterator
it = datagen.flow(samples, batch_size=1)
#  generate samples and plot
for i in range(9):
        #  define subplot
        pyplot.subplot(330 + 1 + i)
        #  generate batch of images
        batch = it.next()
        #  convert to unsigned integers for viewing
        image = batch[0].astype(&#039;uint8&#039;)
        #  plot raw pixel data
        pyplot.imshow(image)
#  show the figure
pyplot.show()اجرای این کد ۹ تصویر ایجاد می‌کند که به اندازه حداکثر ۵۰ درصد به صورت مثبت یا منفی شیفت خورده‌اند.نتیجه شیفت عمودی بر روی تصویرهمان‌طور که می‌بینید در تصویری که ما به عنوان نمونه داریم، تکرار پیکسل‌ها برای پر کردن بخشی که تازه به تصویر اضافه شده، چندان غیرمنطقی به نظر نمی‌رسد؛ اما اگر در کاربرد مسئله شما این موضوع باید تغییر کند، با مشخص کردن مقدار آرگومان fill_mode (که باعث می‌شود از مقدار پیش‌فرض این آرگومان استفاده نشود) می‌توانید از این کار جلوگیری کنید.برگرداندن تصاویر از چپ به راست و بالا به پایینبرگرداندن تصویر به معنای معکوس کردن جهت ردیف‌ها یا ستون‌های پیکسل‌های یک تصویر است که در نهایت موجب می شود تصویر در جهت محورهای عمودی یا افقی تصویر معکوس شود. برای فعال‌سازی این قابلیت باید آرگومان‌های باینری horizontal_flip و vertical_flip در سازنده کلاس ImageDataGenerator مقداردهی شوند.در نمونه تصویر مورد نظر ما، معکوس کردن تصویر در راستای افقی منطقی به نظر می‌رسد اما برگرداندن عمودی آن خیر، چرا که گربه‌ها برعکس و روی هوا زندگی نمی‌کنند! برای انواع دیگر تصاویر، مانند عکس‌های هوایی، کیهان‌شناسی و میکروسکوپی شاید برگردان عمودی (بالا به پایین) هم معنی پیدا کند.در مثال زیر با تعیین و مقداردهی horizontal_flip=True در تابع سازنده به طور تصادفی جهت برخی تصاویر را از چپ به راست معکوس کند.#  load the image
img = load_img(&#039;cat.jpg&#039;)
#  convert to numpy array
data = img_to_array(img)
#  expand dimension to one sample
samples = expand_dims(data, 0)
#  create image data augmentation generator
datagen = ImageDataGenerator(horizontal_flip=True)
#  prepare iterator
it = datagen.flow(samples, batch_size=1)
#  generate samples and plot
for i in range(9):
        # define subplot
        pyplot.subplot(330 + 1 + i)
        #  generate batch of images
        batch = it.next()
        #  convert to unsigned integers for viewing
        image = batch[0].astype(&#039;uint8&#039;)
        #  plot raw pixel data
        pyplot.imshow(image)
#  show the figure
pyplot.show()کد بالا ۹ تصویر زیر را تولید می‌کند که در برخی از آن‌ها تصویر به شکل افقی برگردانده شده است.نتیجه معکوس کردن تصاویر در راستای افقیتکنیک چرخش تصویر به مقدار تصادفیاین روش جهت تقویت دیتاست از چرخش و دوران تصاویر استفاده می‌کند و برای این کار هر تصویر را به مقداری تصادفی در جهت عقربه‌های ساعت می‌چرخاند. حداکثر زاویه چرخش باید در سازنده شئ ImageDataGenerator تعیین شود که عددی بین ۰ تا ۳۶۰ است.چرخش موجب می‌شود برخی از پیکسل‌های اصلی از قاب تصویر خارج شوند و نیاز شود برخی دیگر قسمت‌ها با مقادیر جدیدی پر شوند که چگونگی تعیین مقدار آن‌ها با همان آرگومان fill_mode تعیین می‌شود که مقادیر محتمل برای آن و دیگر آرگومان‌های سازنده‌ی کلاس در این لینک آمده است.در کد زیر با مقداردهی آرگومان rotation_range در سازنده کلاس، مشخص کرده‌ایم که می‌خواهیم تصاویر را به طور تصادفی بین ۰ تا ۹۰ درجه در جهت عقربه‌های ساعت بچرخاند.#  load the image
img = load_img(&#039;cat.jpg&#039;)
#  convert to numpy array
data = img_to_array(img)
#  expand dimension to one sample
samples = expand_dims(data, 0)
# create image data augmentation generator
datagen = ImageDataGenerator(rotation_range=90)
#  prepare iterator
it = datagen.flow(samples, batch_size=1)
# generate samples and plot
for i in range(9):
        #  define subplot
         pyplot.subplot(330 + 1 + i)
        #  generate batch of images
        batch = it.next()
       #  convert to unsigned integers for viewing
        image = batch[0].astype(&#039;uint8&#039;)
        #  plot raw pixel data
        pyplot.imshow(image)
#  show the figure
pyplot.show()کد بالا نمونه تصاویر زیر را تولید می‌کند. در این نمونه نیز مانند مثال‌های قبلی برای پر کردن پیکسل‌های از دست رفته (جابه‌جا شده) از nearest-neighbor یا مقدار پیش‌فرض fill_mode استفاده شده است.نتیجه چرخش تصادفی تصویر تکنیک بزرگنمایی تصویر به اندازه تصادفیبا فعال‌سازی این مورد تصاویر مختلفی با بزرگنمایی‌های تصادفی در بازه‌ی مشخص شده از تصویر اصلی ایجاد می‌شود. مقدار آرگومان zoom_range که در سازنده کلاس ImageDataGenerator می‌بایست تعیین شود، می‌تواند یک عدد اعشاری یا یک آرایه دو عددی برای تعیین بازه بزرگنمایی باشد. اگر تنها یک عدد اعشاری مشخص شود، به طور خودکار به بازه‌ای به شکل زیر تبدیل می‌شود:(lower, upper) = (1 - zoom_range, 1+zoom_range)مقادیر کمتر از ۱.۰ به معنای کوچک کردن تصویر است؛ مثلاً [۰.۵،۰.۵] به طور قطع تمام تصاویر را ۵۰ درصد کوچک‌تر می‌کند و بازه [۱.۵، ۱.۵] همه‌ی تصاویر را ۵۰ درصد بزرگ‌تر می‌کند. هم‌چنین تعیین بازه به شکل [۱.۰،۱.۰] هم هیچ تاثیری در بزرگنمایی ندارد.مثال زیر تصویر نمونه را به طور تصادفی تا حداکثر ۵۰ درصد کوچک می‌کند.#  load the image
img = load_img(&#039;cat.jpg&#039;)
#  convert to numpy array
data = img_to_array(img)
#  expand dimension to one sample
samples = expand_dims(data, 0)
#  create image data augmentation generator
datagen = ImageDataGenerator(zoom_range=[0.5, 1.0])
#  prepare iterator
it = datagen.flow(samples, batch_size=1)
#  generate samples and plot
for i in range(9):
        #  define subplot
        pyplot.subplot(330 + 1 + i)
        #  generate batch of images
        batch = it.next()
        #  convert to unsigned integers for viewing
        image = batch[0].astype(&#039;uint8&#039;)
        #  plot raw pixel data
        pyplot.imshow(image)
#  show the figure
pyplot.show()پس از اجرای کد بالا تصاویر زیر ایجاد می‌شوند. توجه داشته باشید که طول و عرض تصویر برابر نیستند و نسبت طول و عرض ۱:۱ نیست.نتیجه بزرگنمایی تصادفی تصویر تکنیک‌های ذکر شده فقط نمونه‌هایی از معروف‌ترین تکنیک‌های image data augmentation  بودند. همان‌طور که متوجه شدید، این که از کدام تکنیک‌ها و با چه شدتی استفاده کنیم، به نوع داده‌ها و کاربرد سیستم بینایی ماشین مورد نظر بستگی دارد. پس از بررسی برخی روش‌های ابتدایی داده‌افزایی بهتر است نگاهی به آرگومان‌های کلاس ImageDataGenerator بیندازیم.tf.keras.preprocessing.image.ImageDataGenerator(
    featurewise_center=False,
    samplewise_center=False,
    featurewise_std_normalization=False,
    samplewise_std_normalization=False,
    zca_whitening=False,
    zca_epsilon=1e-06,
    rotation_range=0,
    width_shift_range=0.0,
    height_shift_range=0.0,
    brightness_range=None,
    shear_range=0.0,
    zoom_range=0.0,
    channel_shift_range=0.0,
    fill_mode=&amp;quotnearest&amp;quot,
    cval=0.0,
    horizontal_flip=False,
    vertical_flip=False,
    rescale=None,
    preprocessing_function=None,
    data_format=None,
    validation_split=0.0,
    dtype=None)نیاز به افزایش داده‌ها، باعث شده است که تنوع این تکنیک‌ها در حال افزایش باشد. در ادامه چند نمونه دیگر از این تکنیک‌ها را به طور مختصر بررسی می‌کنیم.تکنیک تغییر فضای رنگیروش‌های زیادی برای اجرای این تکنیک وجود دارد و فضایی برای خلاقیت در تبدیل تصویر فراهم کرده است، اما تغییر روشنایی و کنتراست متداول‌ترین روش‌ها هستند.تغییر فضای رنگی جهت داده افزاییتکنیک پاک کردن به صورت تصادفیجالبی این تکنیک در این است که مدل را مجبور می‌کند به جای توجه به یک زیر مجموعه، به کل تصویر توجه کند. به عنوان مثال، مدل نمی‌تواند فیل را فقط با نگاه كردن به صورتش تشخیص دهد؛ زیرا این قسمت ممكن است در برخی از تصاویر حذف شده باشد. این کار در حقیقت مدل را مجبور می‌كند تا به تمامی قسمت‌های تصویر نگاه كند. این تکنیک از روش dropout الهام گرفته شده است که یک روش regularization است. این تکنیک بخصوص در حل مسائلی که در آن‌ها انسداد رخ داده یا برخی از تصاویر نامشخص‌اند (به عنوان مثال تشخیص فیلی که بخشی از آن پشت درخت پنهان شده است) کمک می‌کند.پاک کردن بخشی از تصویر به صورت تصادفی جهت داده‌افزاییتکنیک استفاده از فیلترهای kernelاین تکنیک برای داده‌افزایی از محو و یا شفاف کردن تصاویر (توسط فیلترها) استفاده می‌کند. در واقع در این روش از کرنل‌های NxN  استفاده می‌شودکه شباهت زیادی با convolutional neural net ها دارد. هدف این تکنیک قدرتمند کردن مدل در برابر وضوح تصاویر است، به خصوص زمانی که داده‌های آموزش از لحاظ وضوح کاملا مشابه هستند.تکنیک مخلوط کردن تصاویر(mixing images)میانگین‌گیری از پیکسل‌ها (mixup) و همپوشانی بخش‌هایی از تصاویر (cutmix) دو راه مخلوط کردن تصاویر هستند. برای مطالعه بیشتر درباره این تکنیک می‌توانید به این پست مراجعه کنید.در پایان در نظر داشته باشید که با استفاده از این تکنیک‌ها می‌توان از یک تصویر، چندین تصویر تولید کرد؛ اما این که کدام تکنیک را استفاده کنیم به شدت به داشتن درکی درست از داده‌هایمان بستگی دارد.نویسندگان: محمود ابدالی - عرفان ملکیمنابع:keras.iocoursera.orgmachinelearningmastery.comtowardsdatascience.comopen-mind.ir</description>
                <category>مجموعه دانش‌بنیان شناسا</category>
                <author>مجموعه دانش‌بنیان شناسا</author>
                <pubDate>Sat, 24 Jul 2021 17:09:03 +0430</pubDate>
            </item>
                    <item>
                <title>مقدمه‌ای بر شبکه‌های عصبی بازگشتی (RNNs) - جلسهٔ اول</title>
                <link>https://virgool.io/@shenasa/%D9%85%D9%82%D8%AF%D9%85%D9%87-%D8%A7%DB%8C-%D8%A8%D8%B1-%D8%B4%D8%A8%DA%A9%D9%87-%D9%87%D8%A7%DB%8C-%D8%B9%D8%B5%D8%A8%DB%8C-%D8%A8%D8%A7%D8%B2%DA%AF%D8%B4%D8%AA%DB%8C-rnn-%D8%AC%D9%84%D8%B3%D9%87-%D8%A7%D9%88%D9%84-shdqtsecxijs</link>
                <description>در اولین جلسه از دوره‌ی «مقدمه‌ای بر شبکه‌های عصبی بازگشتی (RNN)» به بررسی ماهیت این شبکه‌ها و سلول‌های تشکیل‌دهنده‌ آن‌ها می‌پردازیم.تطبیق با دوره ویدئوییقسمت  اول (۱۸ دقیقه) – مقدمات شبکه‌های بازگشتیتوجهدر مطالب این دوره تصور شده که خواننده آشنایی مقدماتی با زبان پایتون و شبکه‌های عصبی و پیاده‌سازی آن‌ها با فریم‌ورک‌های Tensorflow و Keras دارد.مقدمهشمایی ساده از یک شبکه بازگشتیتا اینجا تمامی شبکه‌های عصبی عمیق (DNNs) که بررسی کردیم به‌خصوص شبکه‌های عصبی کانولوشنی (CNNs) داده‌های آموزشی را با یک پیش‌فرض مشخص پردازش می‌کردند: «اینکه هیچ ارتباطی بین داده‌های آموزشی وجود ندارد»؛ در واقع هر کدام از داده‌های ورودی شبکه تنها عنصر استخراج ویژگی بودند. در مقابل، شبکه‌های عصبی بازگشتی (Recurrent Neural Networks [RNNs]) نوعی از شبکه‌های عصبی هستند که برای پردازش توالی‌ها و ترتیب‌ها استفاده و در تشخیص الگوهایی که نیازمند چندین مرحله داده‌آزمایی باشند، برای مثال تشخیص الگوها در فریم‌های ویدیو -دنباله‌ای از تصاویر- و یا پردازش‌های زبان طبیعی (NLP) -دنباله‌ای از کلمات- کاربرد فراوانی دارند [۱].مثالبه‌عنوان مثال‌هایی از کاربردهای شبکه‌های بازگشتی، می‌شود به Image Captioning، OCR و Video Classification اشاره کرد. در صورت تمایل در مورد این موضوعات جست‌وجو کنید.روش پردازش توالی‌ها در شبکه‌های بازگشتی با استفاده از یک حلقه در گراف شبکه عصبی است که بازخوردی از خروجی نهایی حالت قبل (خروجی به ازای ورودی قبلی) را ذخیره می‌کند. در شبکه‌های عصبی ساده و شبکه‌های کانولوشنی (CNN) که شبکه‌های پیش‌خور (Feed Forward) هستند، ورودی‌های هر لایه تنها از لایه قبلی بوده و داده‌ها فقط در یک جهت -و با گذشت از لایه‌های میانی- به سمت لایه‌های خروجی حرکت می‌کنند. در این شبکه‌ها، خروجی شبکه به‌ازای هر ورودی به حافظه سپرده نمی‌شود؛ اما در شبکه‌های عصبی بازگشتی (RNN) خروجی مدل (model) در مرحله‌ی قبل به‌عنوان یک حافظه‌ی نهان (Hidden State) همراه ورودی به شبکه بازگردانده می‌شود. این ویژگی باعث می‌شود که الگوریتم بتواند رفتار پویای موقتی را به نمایش بگذارد [۱-۲].حافظه ترتیبیاین نحوه‌ی پردازش ترتیبی داده‌ها، به‌صورت طبیعی در مغز نیز اتفاق می‌افتد؛ برای مثال نحوه‌ی به حافظه سپردن و یادآوری حروف الفبا (به‌عنوان یک توالی از داده‌ها) را در‌نظر بگیرید:الف ب پ ت ث ج چ ح خ د ذ ر ز ژ س ش ص ض ط ظ ع غ ف ق ک گ ل م ن و ه یاگر از شما خواسته شود که دنباله‌ی الفبا را پشت‌سرهم بیان کنید به‌سرعت این‌کار را انجام می‌دهید، اما تصور کنید که بخواهیم این دنباله را به‌صورت وارونه بیان کنیم:ی ه و ن م ل گ ک ق ف غ ع ظ ط ض ص ش س ژ ز ر ذ د خ ح چ ج ث ت پ ب الفمتوجه می‌شوید که -اگر از قبل تمرین نکرده باشید- این کار به‌صورت قابل‌توجهی از حالت اول سخت‌تر است و در واقع نیازمند مرور چند باره‌ی دنباله‌ی اصلی‌ست. این نیاز به مرور دنباله در ذهن، هنگامی که بخواهیم از میانه‌ی دنباله، برای مثال از حرف «ط» به بعد را بیان کنیم هم اتفاق می افتد:الف ب ... ط ظ ع غ ف ... ن و ه یدر  این حالت، احتمال زیاد در ابتدا با چند حرف اول شروع کرده و پس از آنکه مغز الگوی (pattern) دنباله را به‌خاطر آورد، ادامه‌دادن آن به آسانی قابل انجام خواهد بود.اینکه چرا یادآوری دنباله‌ی الفبا -یا هر دنباله مشابه دیگری- در حالت اصلی و فرمی که اولین‌بار به حافظه سپرده شده ساده‌تر است، ارتباط مستقیمی با حافظه ترتیبی مغز یعنی مکانیزمی که مغز از آن برای شناسایی و یادآوری سریع الگو‌ها (پترن‌ها) استفاده می‌کند، دارد [۱].انواع شبکه‌های بازگشتییک تفاوت دیگر شبکه‌های عصبی بازگشتی نسبت به شبکه‌های عصبی ساده و شبکه‌های عصبی کانولوشنی این است که این شبکه‌ها با داده‌هایی با سایز مشخص کار کرده و ورودی‌های با سایز ثابت (مانند یک تصویر) گرفته و خروجی‌های با سایز ثابت (یک آرایه با طول ثابت از احتمالات هر دسته) تولید می‌کنند؛ به علاوه، این مدل‌ها نگاشت میان ورودی و خروجی را در تعداد مراحل مشخصی (تعداد لایه‌های مدل) انجام می‌دهند.در مقابل شبکه‌های بازگشتی اجازه می‌دهند ورودی‌ها و خروجی‌هایی با توالی‌های متغیر داشته باشیم، از این رو شبکه‌های عصبی بازگشتی از نگاه ورودی/خروجی‌ها به دسته‌های زیر تقسیم می‌شوند:ورودی‌ها قرمز، شبکه RNN سبز و خروجی‌های ممکن آبی.  برای مثال،ترجمه ماشین (مانند Google Translator) با استفاده از شبکه‌های «many to many» پیاده‌سازی می‌شود. متن زبان مبدأ به‌صورت یک توالی به شبکه خوراک شده و شبکه متن ترجمه شده را در خروجی برمی‌گرداند.تحلیل احساسات (مانند تشخیص این که آیا این نظر مثبت است یا منفی) در اکثر مواقع با شبکه‌های «many to one» پیاده‌سازی می‌شود. متن مورد تحلیل به شبکه خوراک شده و یک دسته (کلاس [class]) (مثبت یا منفی بودن متن) به‌عنوان خروجی مشخص می‌شود [۳].انواع مختلف شبکه‌های عصبی بازگشتی و تقسیم‌بندی‌های آن‌ها بر اساس ورودی/خروجی را در ادامه دوره به تفصیل بررسی خواهیم کرد.پیش از شروع بررسی شبکه‌های RNN به‌صورت دقیق‌تر و جزئی‌تر، اجازه بدید با یک مثال ساده، نحوه کار این شبکه‌ها و تفاوت‌های آن با شبکه‌های غیر بازگشتی را مرور کنیم:یک مثال ساده - چراغ راهنماییمثال کنترل چراغ راهنمایی توسط شبکه عصبیفرض کنید می‌خواهیم شبکه‌ای آموزش دهیم تا وضعیت یک چراغ راهنمایی را در هر دقیقه تعیین کند، این شبکه باید به این صورت عمل کند که با بررسی وضعیت راه تصمیم به نمایش چراغ با رنگ مناسب بگیرد.وضعیت راهباز بودنبسته بودنوضعیت چراغسبز: اجازه‌ی عبورزرد: کاهش سرعتقرمز: توقف (عدم اجازه‌ی عبور)حالت اولدر اولین حالت، شبکه با بررسی وضعیت راه تصمیم می‌گیرد که چراغ سبز را روشن کند یا چراغ قرمز را. اگر راه باز باشد چراغ سبز و اگر بسته باشد چراغ قرمز روشن خواهند شد:رابطه ورودی‌ها و خروجی‌های مسئله در حالت اول همانطور که مشخص است، وضعیت نهایی شبکه که مشخص‌کننده‌ی وضعیت چراغ راهنمایی خواهد بود کاملاً بستگی به ورودی‌های شبکه که وضعیت راه‌ است دارد. چنین مسئله‌ای، به سادگی توسط یک شبکه پیش‌خور (برای مثال یک شبکه MLP یا هر شبکه‌‌ی دیگری با لایه‌های تمام-متصل) قابل حل است و می‌توانیم هر کدام از وضعیت‌های ورودی و خروجی خود را توسط یک بردار one-hot نمایش بدهیم:بردارهای one-hot ورودی‌ها و خروجی‌هامشخص‌است که برای پیاده‌سازی همچین شبکه‌ای به دو نورون (neuron) در لایه‌ی ورودی و ۳ نورون در لایه‌ی خروجی احتیاج خواهیم داشت.نکتهشبکه در این مسئله، می‌تواند لایه‌های پنهان داشته یا نداشته باشد.(چرا که وزن‌های شبکه قابلیت نگاشت این مقادیر را دارا هستند)چنین شبکه تمام-متصلی را می‌توانیم به‌صورت یک ضرب ماتریسی در نظر بگیریم، با فرض اینکه شبکه‌ی یادگرفته شده (Train شده) است، یک ماتریس وزن (مانند ماتریس تصویر پایین) وجود خواهد داشت که با ضرب کردن آن در ورودی‌ها، خروجی شبکه بر اساس هرکدام قابل محاسبه باشد.نمایش شبکه حالت اول به‌صورت یک ضرب ماتریسی همچنین، می‌توانیم این شبکه را به‌صورت گراف زیر تصویر کنیم. در این گراف دو گره ورودی و سه گره خروجی داریم که یال‌های وزن‌های آن مقادیر ۰ (یال‌های کم‌رنگ) و یا ۱ (یال‌های پررنگ) را خواهند داشت:تصویرسازی ساده‌ای از شبکه در حالت اول، یال‌های تیره ۱ و یال‌های کم‌رنگ ۰حالت دومدر این حالت رویکرد دیگری از مسئله را در نظر گرفته و نحوه‌ی تصمیم‌گیری را کمی تغییر می‌دهیم، حال می‌خواهیم چراغ راهنمایی ما تنها وابسته به وضعیت قبلی خود از چراغ سبز به زرد و سپس به قرمز تغییر وضعیت دهد:رابطه ورودی‌ها و خروجی‌های مسئله در حالت دوم همانطور که مشخص است، وضعیت نهایی شبکه که مشخص‌کننده‌ی وضعیت چراغ راهنمایی خواهد بود، تنها وابسته به وضعیت قبلی شبکه (خروجی قبلی شبکه) است.یادآوریتصویر بالا را با تصویر ابتدای بخش «مقدمه» مقایسه کنید.بنابراین برای پیاده‌سازی همچین مدلی، به شبکه‌ای احتیاج داریم که به‌صورت بازگشتی عمل کرده و خروجی مرحله قبلی خود را به‌عنوان ورودی دریافت کند:نمایش شبکه حالت دوم به‌صورت بازگشتی (RNN)برای پیاده‌سازی همچین شبکه‌ای، از آنجایی که هر وضعیت را با یک بردار one-hot کد می‌کردیم به سه نرون در لایه‌های ورودی و خروجی احتیاج خواهیم داشت.چنین شبکه‌ای را نیز می‌توانیم به‌صورت یک ضرب ماتریسی در نظر گرفته و با فرض اینکه شبکه یادگرفته شده (Train شده) است، یک ماتریس وزن (مانند ماتریس تصویر پایین) وجود خواهد داشت که با ضرب کردن آن در ورودی‌ها، خروجی شبکه بر اساس هرکدام قابل محاسبه باشد.نمایش شبکه حالت دوم به‌صورت یک ضرب ماتریسی چنین شبکه‌ای را می‌توانیم به‌صورت گراف زیر تصویر کنیم که در آن سه گره ورودی و سه گره خروجی داریم و گره‌های ورودی شبکه در واقع همان حالت‌های قبلی شبکه هستند. همچنین، در این تصویرسازی تنها یال‌های با وزن ۱ نمایش داده شده‌اند:تصویرسازی ساده‌ای از شبکه در حالت دوم، شبکه تمام-متصل بوده و تنها یال‌های با وزن ۱ نمایش داده شدهحالت سومحال، حالتی را در نظر بگیرید که تنها وابسته به وضعیت راه (حالت اول) و یا وضعیت قبلی چراغ‌ها (حالت دوم) نباشیم و در واقع در حالتی نزدیک‌تر به واقعیت برای تصمیم‌گیری وضعیت چراغ‌ها وابسته به هم وضعیت راه و هم حالت قبلی چراغ‌ها باشیم. این‌بار قصد رسم شبکه و بررسی آن را نداریم اما بررسی این وضعیت به شناخت شبکه‌های عصبی بازگشتی کمک بسیاری می‌کند:بنابراین، به‌عنوان‌مثال، به‌این صورت عمل می‌کنیم که اگر راه باز است و وضعیت قبلی چراغ قرمز است، چراغ سبز را نشان می‌دهیم، اما اگر راه بسته‌است و وضعیت چراغ اگر سبز بود به زرد و اگر زرد بود به قرمز تغییر می‌کند.نکتهفرض می‌کنیم که هر تغییر وضعیت بین باز یا بسته بودن راه‌ها بیشتر از یک دقیقه طول می‌کشد.یادآوریفواصل زمانی تغییر وضعیت چراغ یک دقیقه هستند.پس در هر مرحله از خوراک این شبکه، علاوه بر ورودی متشکل از وضعیت راه (باز یا بسته بودن) به ورودی دیگری که خروجیِ قبلیِ شبکه را نمایش دهد نیز نیاز داریم. به دلیل پیچیدگی زیاد (ورودی‌ها و وزن‌های هر کدام باعث پیچیدگی زیاد گراف خواهد شد) از رسم شبکه مربوط به حالت سوم خودداری می‌کنیم. اما نکته مهمی که نیاز بود در این مثال فرا بگیریم -علاوه‌بر مشاهده‌ی یک نمونه ساده از شبکه‌هایی بازگشتی در عمل- چرایی نیاز به شبکه‌های دارای اتصالات بازگشتی و چگونگی رفتار آن‌هاست.در این جلسه ابتدا با کلیّات شبکه‌های بازگشتی، انواع و موارد استفاده‌‌ی آن‌ها آشنا شده و همراه یک مثال ساده به‌صورت ابتدایی با یک سلول (گره) شبکه‌های بازگشتی آشنا شدیم و دریافتیم این واحدها دارای دو ورودی هستند. یک ورودی، مانند شبکه‌های پیش‌خور از داده‌های ورودی شبکه گرفته شده ورودی دیگر از وضعیت قبلی واحد.در جلسه بعدی به بررسی دقیق‌تر این واحدهای تشکیل دهنده شبکه‌های بازگشتی پرداخته و در ادامه یک شبکه ساده برای تخمین یک تابع سینوسی پیاده‌سازی می‌کنیم.برای پیاده‌سازی در جلسات آینده از کتابخانه‌ی Keras و زبان پایتون استفاده می‌کنیم.اگر با این کتابخانه یا کتابخانه‌‌های دیگری مثل numpy یا Matplotlib آشنایی ندارید، تا جلسه‌ی آینده فرصت خوبیست مرور کلی‌ای بر آن‌ها داشته باشید.می‌توانید لیست جلسات دوره را در این پست مشاهده کنید.جلسه قبلیجلسه بعدیاین دوره به کوشش علی‌رضا اخوان‌پور به‌صورت ویدئویی تهیه شده و به قلم محمدحسن ستاریان با نظارت ایشان به‌صورت متنی نگارش و توسط بهار برادران افتخاری ویرایش شده‌ست.در صورت تمایل به خرید دوره به صورت ویدئویی می‌توانید با استفاده از کد تخفیف shenasablog_intro از ۲۰ درصد تخفیف بهره‌مند شوید.منابعدر انتهای هر پاراگراف این پست شماره‌ی منبع یا منابعی که در نگارش آن قسمت از آن‌ها کمک گرفته شده ذکر شده، در لیست زیر می‌توانید هر کدام از این منابع را مشاهده و مطالعه کنید:[۱] (با دخل و تصرف) راهنمای مصوری بر شبکه‌های عصبی بازگشتی - Towards Data Science[۲] (خط آخر) ویکی‌پدیا - مقاله «شبکه‌های عصبی بازگشتی»[۳] وبلاگ آندره کارپاسی</description>
                <category>مجموعه دانش‌بنیان شناسا</category>
                <author>مجموعه دانش‌بنیان شناسا</author>
                <pubDate>Wed, 14 Jul 2021 22:16:08 +0430</pubDate>
            </item>
                    <item>
                <title>دوره: مقدمه‌ای بر شبکه‌های عصبی بازگشتی (RNNs)</title>
                <link>https://virgool.io/@shenasa/%D8%AF%D9%88%D8%B1%D9%87-%D9%85%D9%82%D8%AF%D9%85%D9%87-%D8%A7%DB%8C-%D8%A8%D8%B1-%D8%B4%D8%A8%DA%A9%D9%87-%D9%87%D8%A7%DB%8C-%D8%B9%D8%B5%D8%A8%DB%8C-%D8%A8%D8%A7%D8%B2%DA%AF%D8%B4%D8%AA%DB%8C-rnns-bxhsb2dpboob</link>
                <description>توضیحاتدوره‌ی پیشرفته آموزش یادگیری عمیق، دومین دوره‌ی آموزشی از سری دوره‌های یادگیری ماشین و یادگیری عمیق شناسا با موضوع «آشنایی و پیاده‌سازی شبکه‌های عصبی بازگشتی و سری‌های زمانی با تنسورفلو ۲» است که توسط مهندس علی‌رضا اخوان‌پور مدرس دانشگاه و محقق یادگیری عمیق تدریس می‌شود.این دوره، پیش از این به‌صورت ویدئویی تدریس شده و قابل دسترس است، اما در نظر داریم مطالب دوره را به‌صورت متنی و رایگان، در قالب یک مجموعه پست با عنوان «مقدمه‌ای بر شبکه‌های عصبی بازگشتی (RNN)» منتشر کنیم.جلسات دوره با فواصل حداکثر یک ماه منتشر شده و لیست آن‌ها در انتهای این پست در دسترس خواهد بود.مطالبدر این دوره، مباحث پیشرفته‌ی یادگیری عمیق با تمرکز بر شبکه‌های عصبی بازگشتی، با رویکرد عملی و پیاده‌سازی سری‌های زمانی با زبان پایتون (Python)، کتاب‌خانه کراس (Keras) و فریم‌ورک Tensorflow 2 بررسی خواهند شد. در ابتدا پس از آشنایی با مباحث مقدماتی شبکه‌های بازگشتی، به بررسی انواع سلول‌ها در شبکه‌های بازگشتی می‌پردازیم و در ادامه با چالش‌های این شبکه‌ها مانند طول دنباله‌ی متغیر یا محوشدگی و انفجار گرادیان آشنا می‌شویم؛ در پایان انواع مختلف این شبکه‌ها مانند شبکه‌های بازگشتی دوطرفه یا مدل‌های توالی به توالی را بررسی خواهیم کرد.همچنین در این دوره  مثال‌هایی درباره تمامی مباحث مطرح شده تمرین خواهید کرد که شما را با چگونگی پیاده‌سازی آن‌ها با استفاده از Tensorflow 2 آشنا خواهد کرد. با توجه به این که این مثال‌ها در‌ حوزه‌ی پردازش زبان طبیعی مطرح می‌شوند، در پایان با مقدمات این حوزه از یادگیری عمیق و راه‌حل‌هایی برای مسائلی مانند طبقه‌بندی متن، تولید متن با استفاده از مدل‌های زبانی و ترجمه ماشینی نیز آشنایی پیدا خواهید کرد.تهیه دورهٔ ویدئوییبرای تهیه‌ی این دوره به‌صورت ویدئویی می‌توانید از لینک زیر استفاده کنید. همچنین با استفاده از کد تخفیف shenasablog_intro می‌توانید از ۲۰ درصد تخفیف جهت خرید دوره بهره‌مند شوید: http://class.vision/deep-rnn/ سرفصل‌های کلی دوره را می‌توانید در لینک بالا مشاهده کنید؛ در تولید دوره‌ی متنی تلاش خواهیم کرد به این سرفصل‌ها وفادار بمانیم.پیش‌نمایش‌هایی از دوره در این کانال آپارات قابل مشاهده است.پیش‌نیاز‌های دورهدوره فوق، دوره‌ای پیشرفته حساب شده و در تولید محتوای آن تصور شده که خوانندگان آشنایی نسبتاً خوبی با موارد زیر دارند:مقدمات شبکه‌های عصبی (NN) و  شبکه‌های کانولوشنی (CNN)زبان برنامه‌نویسی پایتون (Python)کتابخانه‌/فریم‌ورک‌های Tensorflow و Kerasپیاده‌سازی اولیه‌ی شبکه‌های عصبی (ساخت شبکه‌ها به حالت‌های Sequential API یا Model Subclassing و یا Functional API در کتاب‌خانه کراس [Keras])جلسات دورهمقدمه‌ای بر شبکه‌های عصبی بازگشتی (RNN) - جلسهٔ اولبررسی ماهیت این شبکه‌ها و سلول‌های تشکیل‌دهنده‌ آن‌هامقدمه‌ای بر شبکه‌های عصبی بازگشتی (RNN) - جلسهٔ دومبررسی دقیق‌تر اجزای تشکیل دهنده این شبکه‌ها یعنی واحد‌های بازگشتی و معادلات آن‌هامقدمه‌ای بر شبکه‌های عصبی بازگشتی (RNN) - جلسهٔ سومپیاده‌سازی یک شبکه‌ی RNN ساده با استفاده از کتاب‌خانه‌ی کراس (Keras)مقدمه‌ای بر شبکه‌های عصبی بازگشتی (RNN) - جلسهٔ چهارمبررسی روش‌های استفاده از یک شبکه‌ی عصبی بازگشتیِ آموزش داده‌شده برای پیش‌بینی داده‌هایی با طول دنباله‌های ورودی دیگری (گام‌های زمانی متفاوت)مقدمه‌ای بر شبکه‌های عصبی بازگشتی (RNN) - جلسهٔ پنجمبررسی محوشدگی و انفجار گرادیان دو مشکل اصلی شبکه‌‌های عصبی بازگشتی ساده (Simple RNN)این دوره به کوشش علی‌رضا اخوان‌پور به‌صورت ویدئویی تهیه شده و به قلم محمدحسن ستاریان با نظارت ایشان به‌صورت متنی نگارش و توسط بهار برادران افتخاری ویرایش شده‌ست.</description>
                <category>مجموعه دانش‌بنیان شناسا</category>
                <author>مجموعه دانش‌بنیان شناسا</author>
                <pubDate>Wed, 14 Jul 2021 22:02:29 +0430</pubDate>
            </item>
            </channel>
</rss>