فاز 12 · درس 2

آموزش CLIP و پیش‌آموزش کنتراستیو تصویر و متن

نوع
ساختنی
زمان
حدود 180 دقیقه
زبان‌ها
Python (stdlib, InfoNCE + sigmoid loss implementations)
پیش‌نیاز
فاز 12 · 01 (وصله‌های ViT)، فاز 7 (ترنسفورمرها)
یک ترازو با دو کفه نورانی معلق در تاریکی که یک تصویر و یک متن را در تعادل نگه داشته است
فهرست مطالب
  1. اهداف یادگیری
  2. صورت مسئله
  3. مفاهیم پایه
  4. انکودر دوگانه (Dual encoder)
  5. تابع زیان InfoNCE
  6. دما
  7. چرا سیگموئید مقیاس‌پذیری بهتری دارد (SigLIP)
  8. دسته‌بندی صفر-داده
  9. ارزیابی خطی و فاین‌تیونینگ
  10. مدل SigLIP 2: فناوری NaFlex و ویژگی‌های متراکم
  11. مدل‌های ALIGN، BASIC، OpenCLIP و EVA-CLIP
  12. سقف دسته‌بندی صفر-داده
  13. پیاده‌سازی عملی
  14. تحویل پروژه
  15. تمرین‌ها
  16. اصطلاحات کلیدی
  17. برای مطالعه‌ی بیشتر

پیش از معرفی CLIP، بینایی ماشین به‌شدت وابسته به دیتاست‌های برچسب‌خورده‌ی دستی بود؛ روندی پرهزینه، زمان‌بر و محدود به کلاس‌های از پیش تعریف‌شده. مدل CLIP با پیش‌آموزش کنتراستیو روی صدها میلیون جفت تصویر و متن آزاد وب نشان داد که می‌توان بدون برچسب صریح، انکودر تصویر و متن را در یک فضای برداری یکپارچه هم‌راستا کرد. امروزه این فضای امبدینگ ستون فقرات مدل‌های بینایی-زبان (VLM) مدرن و سیستم‌های جستجوی معنایی تصویر است.

درک معماری‌های انکودر دوگانه (Dual encoder) و تفاوت‌های بنیادین میان توابع زیان، مهارتی ضروری برای مهندسان هوش مصنوعی است. این درس با شکافتن ریاضیات InfoNCE و مقایسه‌ی آن با رویکرد مقیاس‌پذیر سیگموئید در SigLIP 2، نحوه‌ی پیاده‌سازی این سازوکارها را در پایتون استاندارد نشان می‌دهد تا بدون نیاز به زیرساخت‌های محاسباتی سنگین، منطق دسته‌بندی صفر-داده (Zero-shot) را درک کنید.

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

مدل CLIP شرکت OpenAI در سال 2021 ایده‌ای را اثبات کرد که برای پیش‌رانش پنج سال بعد کافی بود: هم‌راستاسازی یک انکودر تصویر و یک انکودر متن در یک فضای برداری مشترک، آن هم فقط با استفاده از جفت‌های تصویر-کپشن نویزی وب و یک تابع زیان کنتراستیو (contrastive loss). بدون هیچ برچسب نظارت‌شده‌ای. با 400 میلیون جفت داده. فضای امبدینگ حاصل، دسته‌بندی صفر-داده (zero-shot classification) و بازیابی تصویر-متن را ممکن می‌کند و در تمام مدل‌های بزرگ چندحالته‌ی (VLM) سال 2026 به‌عنوان برج دیداری (vision tower) به کار می‌رود. در سال 2025 مدل SigLIP 2 تابع سافت‌مکس (softmax) را با سیگموئید (sigmoid) جایگزین کرد و با هزینه‌ای کمتر، از مقیاس CLIP هم فراتر رفت. در این درس، مبانی ریاضیاتی را از InfoNCE تا تابع زیان جفتی سیگموئید بررسی می‌کنیم و گام آموزشی آن را با کتابخانه‌ی استاندارد Python می‌سازیم.

اهداف یادگیری

  • استخراج فرمول تابع زیان InfoNCE از اطلاعات متقابل (mutual information) و پیاده‌سازی نسخه‌ی برداریِ پایدار از نظر عددی (numerical stability).
  • توضیح چرایی مقیاس‌پذیری تابع زیان جفتی سیگموئید (SigLIP) تا اندازه‌ی دسته‌ی 32768 به بالا، بدون تحمیل بار پردازشی all-gather که سافت‌مکس به آن نیاز دارد.
  • اجرای دسته‌بندی صفر-داده روی ImageNet با ساخت قالب‌های پرامپت متنی (a photo of a {class}) و گرفتن argmax روی شباهت کسینوسی (cosine similarity).
  • نام بردن از چهار اهرم اصلی در پیش‌آموزش CLIP و SigLIP: اندازه‌ی دسته، دما (temperature)، قالب پرامپت (prompt template) و کیفیت داده‌ها.

صورت مسئله

بینایی ماشین پیش از CLIP متکی به یادگیری نظارت‌شده بود: جمع‌آوری دیتاست‌های برچسب‌خورده (ImageNet با 1.2 میلیون تصویر و 1000 کلاس)، آموزش یک CNN و ارائه‌ی مدل. برچسب‌گذاری گران تمام می‌شود، به سوگیری مصححان و موارد توافق‌شده محدود می‌ماند و بدون فاین‌تیون به تسک‌های جدید منتقل نمی‌شود.

در وب بیش از یک میلیارد جفت تصویر-کپشن با برچسب‌گذاری نه‌چندان دقیق و رایگان وجود دارد. تصویر یک سگ گلدن رتریور با متن جایگزین «سگم مکس در پارک»، یک سیگنال نظارتی با خود دارد؛ چراکه متنْ تصویر را توصیف می‌کند. پرسش این است: آیا می‌توان این داده‌ها را به روندی برای آموزش مفید تبدیل کرد؟

پاسخ CLIP این بود: با جفت‌های تصویر-کپشن مثل یک تسک تطبیق (matching) برخورد کنیم. به ازای دسته‌ای با N تصویر و N کپشن، مدل یاد می‌گیرد هر تصویر را با کپشن خودش میان N-1 نمونه‌ی انحرافی تطبیق دهد. سیگنال نظارتی چنین است: «این دو مورد به هم تعلق دارند؛ آن N-1 موردِ دیگر، نه.» بدون برچسب کلاس‌ها، بدون حاشیه‌نویسی انسانی و فقط با یک تابع زیان کنتراستیو.

فضای امبدینگ حاصل، فراتر از هدفی عمل می‌کند که CLIP برایش آموزش دیده بود. دسته‌بندی صفر-داده روی ImageNet به این دلیل جواب می‌دهد که «عکس یک گربه» در فضای برداری نزدیک تصاویری از گربه‌ها می‌نشیند که هیچ‌وقت برچسب صریح «گربه» نخورده بودند. این همان شرط‌بندی درستی بود که تمام VLMهای سال 2026 را شکل داد.

مفاهیم پایه

انکودر دوگانه (Dual encoder)

مدل CLIP از دو برج مجزا تشکیل شده است:

  • انکودر تصویر f: مبتنی بر ViT یا ResNet که برای هر تصویر یک بردار D-بعدی خروجی می‌دهد.
  • انکودر متن g: یک ترنسفورمر کوچک که برای هر کپشن یک بردار D-بعدی می‌سازد.

هر دو برج خروجی‌های خود را به طول واحد نرمال می‌کنند. از آنجا که نُرم هر دو بردار برابر با یک است، شباهت آن‌ها به صورت cos(f(x), g(y)) = f(x)^T g(y) به دست می‌آید.

برای دسته‌ای شامل NN جفت (تصویر، کپشن)، ماتریس شباهت S با ابعاد (N, N) ساخته می‌شود:

S[i,j]=cos⁡(f(xi),g(yj))/τS[i, j] = \cos(f(x_i), g(y_j)) / \tau

که در آن tau دمای یادگیری‌پذیر است (CLIP مقدار اولیه‌ی آن را 0.07 می‌گذارد و آن را در فضای لگاریتمی یاد می‌گیرد).

تابع زیان InfoNCE

مدل CLIP از یک تابع زیان آنتروپی متقاطع (cross-entropy) متقارن روی سطرها و ستون‌ها استفاده می‌کند:

loss_i2t = CE(S, labels=identity)     # each image's positive is its own caption
loss_t2i = CE(S^T, labels=identity)   # each caption's positive is its own image
loss = (loss_i2t + loss_t2i) / 2

این همان InfoNCE است. تابع سافت‌مکس در آنتروپی متقاطع وادار می‌کند هر تصویر بیشتر از همه‌ی کپشن‌های دیگر در دسته، با کپشنِ خودش تطبیق داده شود. «موارد منفی» همان باقی آیتم‌های داخل دسته‌اند. دسته‌های بزرگ‌تر = منفی‌های بیشتر = سیگنال قوی‌تر. CLIP با دسته‌های 32k آموزش دید؛ در این ساختار، مقیاس حرف اول را می‌زند.

دما

پارامتر tau میزان تیزی توزیع سافت‌مکس را کنترل می‌کند. مقدار کمِ τ\tau ← توزیع تیز و اثر داده‌کاوی منفی‌های دشوار (hard negative mining). مقدار بالای τ\tau ← توزیع هموار که همه‌ی نمونه‌ها در آن سهم دارند. مدل CLIP عبارت log⁡(1/τ)\log(1/\tau) را یاد می‌گیرد و برای جلوگیری از فروپاشی، آن را برش می‌زند (clip). مدل SigLIP 2 مقدار اولیه‌ی τ\tau را ثابت نگه می‌دارد و در عوض، از یک بایاس یادگیری‌پذیر بهره می‌برد.

چرا سیگموئید مقیاس‌پذیری بهتری دارد (SigLIP)

تابع سافت‌مکس به همگام بودن تمام ماتریس شباهت نیاز دارد. در آموزش توزیع‌شده، باید با عملیات all-gather همه‌ی امبدینگ‌ها را به تک‌تک نسخه‌ها برسانید و بعد سافت‌مکس را حساب کنید. هزینه‌ی ارتباطی این کار نسبت به تعداد پردازنده‌ها از مرتبه‌ی توان دو است.

مدل SigLIP سافت‌مکس را با یک سیگموئید نظیر‌به‌نظیر جایگزین می‌کند: برای هر جفت (i, j)، تابع زیان یک دسته‌بندی دودویی است: «آیا این دو مورد با هم جفت هستند یا خیر؟» برچسب کلاس‌های مثبت روی قطر اصلی قرار دارند و بقیه، منفی‌اند. فرمول این تابع زیان چنین است:

L=−1N∑(i,j)[yijlog⁡sigmoid(S[i,j])+(1−yij)log⁡sigmoid(−S[i,j])]L = -\frac{1}{N} \sum_{(i, j)} \Big[ y_{ij} \log \mathop{\mathrm{sigmoid}}(S[i,j]) + (1-y_{ij}) \log \mathop{\mathrm{sigmoid}}(-S[i,j]) \Big]

اگر i == j باشد y_ij = 1 است و در غیر این صورت 0. تابع زیان هر جفت مستقل است؛ بنابراین به all-gather نیازی نیست. هر GPU بلوک محلی خود را حساب می‌کند و جمع می‌زند. SigLIP 2 با هزینه‌ای ناچیز تا دسته‌هایی به بزرگی 32k تا 512k مقیاس می‌گیرد؛ جایی که CLIP به ارتباطات بسیار سنگین‌تری نیاز دارد.

دسته‌بندی صفر-داده

به ازای N نام کلاس، برای هر کلاس یک قالب پرامپت متنی می‌سازیم:

"a photo of a {class}"

هر قالب را با انکودر متن و تصویر را با انکودر تصویر به امبدینگ تبدیل کنید. کلاسی با بیشترین شباهت کسینوسی (argmax) همان کلاس پیش‌بینی‌شده است؛ بدون این‌که مدل را روی کلاس‌های هدف آموزش داده باشید.

قالب پرامپت اهمیت زیادی دارد. مقاله‌ی اصلی CLIP برای هر کلاس از 80 قالب پرامپت (ساده، هنری، عکس، نقاشی و غیره) استفاده کرد و میانگین امبدینگ آن‌ها را گرفت که 3 امتیاز به دقت ImageNet اضافه کرد. در کارهای امروزی معمولاً به یک یا دو قالب بسنده می‌شود.

ارزیابی خطی و فاین‌تیونینگ

دسته‌بندی صفر-داده یک خط مبنا است. ارزیابی خطی (linear probe؛ آموزش یک لایه‌ی خطی روی ویژگی‌های منجمد CLIP برای کلاس‌های هدف) در تسک‌های درون‌دامنه‌ای دسته‌بندی صفر-داده را شکست می‌دهد. فاین‌تیونینگِ کامل در داده‌های درون‌دامنه‌ای ارزیابی خطی را هم پشت سر می‌گذارد، اما می‌تواند به انتقال صفر-شات (zero-shot transfer) آسیب بزند. با سه ساختار و سه بده‌بستان متفاوت طرف هستیم.

مدل SigLIP 2: فناوری NaFlex و ویژگی‌های متراکم

مدل SigLIP 2 (سال 2025) این موارد را اضافه می‌کند:

  • فناوری NaFlex: مدلی واحد که نسبت ابعاد (aspect ratio) و رزولوشن‌های متغیر را بدون تغییر اندازه مدیریت می‌کند.
  • ویژگی‌های متراکم (dense features) بهتر برای بخش‌بندی تصویر و تخمین عمق، با هدف استفاده به‌عنوان بک‌بون منجمد در VLMها.
  • چندزبانه: آموزش‌دیده روی بیش از 100 زبان؛ در حالی که CLIP فقط به زبان انگلیسی محدود بود.
  • مقیاس 1 میلیارد پارامتری؛ در حالی که سقف CLIP در 400 میلیون متوقف شد.

در VLMهای متن‌باز سال 2026، مدل SigLIP 2 SO400m/14 برج دیداریِ پیش‌فرض است. اما CLIP هنوز انتخاب اول برای بازیابی تصویر-متن خالص است؛ مخصوصاً زمانی که توزیع آموزشیِ دیتاست LAION-2B با الگوی پرامپت‌های شما تطابق داشته باشد.

مدل‌های ALIGN، BASIC، OpenCLIP و EVA-CLIP

مدل ALIGN (گوگل، 2021): ایده‌ای مشابه CLIP با مقیاس 1.8 میلیارد جفت که 90٪ آن‌ها نویزی بودند؛ اثباتی بر این‌که داده‌های نویزی هم مقیاس می‌گیرند. مدل OpenCLIP (پروژه‌ی LAION): بازتولید متن‌باز CLIP روی LAION-400M و LAION-2B در مقیاس‌های گوناگون که چک‌پوینت متن‌بازِ مرجع شد. مدل EVA-CLIP: مقداردهی اولیه از مدل‌سازی تصویر پوشانده‌شده (masked image modeling) و بک‌بونی قدرتمند برای VLMها. مدل BASIC: تلفیق گوگل از CLIP و ALIGN. همه‌ی این مدل‌ها از یک خانواده‌اند و تفاوتشان در داده‌ها و نحوه‌ی تیونینگ است.

سقف دسته‌بندی صفر-داده

دقت مدل‌های هم‌رده‌ی CLIP در دسته‌بندی صفر-داده روی ImageNet روی حدود 76٪ قفل می‌شود (مثل CLIP-G و OpenCLIP-G). فراتر رفتن از این سقف یا نیازمند داده‌های بسیار بزرگ‌تر است (SigLIP 2 به بالای 80٪ می‌رسد) یا تغییر در معماری (سرهای نظارت‌شده، پارامترهای بیشتر). این بنچمارک رو به اشباع است؛ ارزش اصلی در همان فضای امبدینگی نهفته که خوراک VLMهای پایین‌دستی می‌شود.

ادغام چندوجهیتغییر حالت ادغام زودهنگام در برابر دیرهنگام
MULTIMODAL FUSIONAn image encoder and a text encoder each map their input into vectors. Late fusion projects both into a shared embedding space and compares them only at the end, which is how contrastive models like CLIP align images and captions. Early fusion concatenates the token streams and models them jointly from the start, letting the two modalities attend to each other throughout.تصویرمتنانکودر تصویرانکودر متنپروجکتپروجکتمشترک
یک انکودر تصویر و یک انکودر متن هرکدام ورودی خود را به بردار نگاشت می‌کنند. در ادغام دیرهنگام (Late fusion)، هر دو به یک فضای امبدینگ مشترک پروجکت شده و فقط در انتها مقایسه می‌شوند؛ روشی که مدل‌های کنتراستیو مانند CLIP برای تطبیق تصاویر و زیرنویس‌ها به کار می‌برند. ادغام زودهنگام (Early fusion) جریان‌های توکن را ادغام و از همان ابتدا آن‌ها را به‌طور مشترک مدل‌سازی می‌کند، و اجازه می‌دهد دو وجه در تمام طول مسیر بر یکدیگر توجه (attention) داشته باشند.

پیاده‌سازی عملی

کد code/main.py این بخش‌ها را پیاده‌سازی می‌کند:

  1. یک انکودر دوگانه‌ی ساده (ویژگی‌های تصویر بر پایه‌ی هش و ویژگی‌های کاراکتری متن) تا ساختار InfoNCE را بدون نیاز به numpy ببینید.
  2. تابع زیان InfoNCE با Python خالص (پایداری عددی از طریق لگاریتم مجموع نمایی یا log-sum-exp).
  3. تابع زیان جفتی سیگموئید جهت مقایسه.
  4. روتین دسته‌بندی صفر-داده: محاسبه‌ی شباهت کسینوسی در برابر مجموعه‌ای از پرامپت‌های متنی و استخراج پیش‌بینی با argmax.

کد را اجرا کنید و نمودار تابع زیان را ببینید. ارقام آزمایشی‌اند، اما رفتار کلی گرادیان‌ها دقیقاً مثل خروجی یک فرایند واقعیِ آموزش CLIP است.

تحویل پروژه

خروجی این درس فایل outputs/skill-clip-zero-shot.md است. این مهارت با گرفتن مجموعه‌ای از تصاویر (از طریق مسیر فایل) و فهرستی از کلاس‌های هدف، پرامپت‌های متنی را با قالب CLIP می‌سازد، امبدینگ هر دو سمت را با یک چک‌پوینت مشخص (مثل openai/clip-vit-large-patch14) استخراج می‌کند و پیش‌بینی‌های top-1 و top-5 را به همراه نمرات شباهت برمی‌گرداند. این مهارت در مورد کلاس‌هایی که در لیست پرامپت‌ها نباشند هیچ ادعایی نمی‌کند.

تمرین‌ها

  1. تابع زیان InfoNCE را برای یک دسته‌ی 4 جفتی به صورت دستی محاسبه کنید. ماتریس شباهت 4×4 را بسازید، سافت‌مکس بگیرید، قطر اصلی را استخراج و آنتروپی متقاطع را محاسبه کنید. پیاده‌سازی پایتونی خود را با این محاسبات دستی تطبیق دهید.

  2. مدل SigLIP علاوه بر دما از پارامتر بایاس b استفاده می‌کند: S'[i,j] = S[i,j]/tau + b. توضیح دهید وقتی در دسته عدم‌توازن کلاس‌ها بالاست (تعداد منفی‌ها در هر سطر خیلی بیشتر از مثبت‌هاست)، پارامتر b چه نقشی دارد؟ بخش 3 مقاله‌ی SigLIP (arXiv:2303.15343) را مطالعه کنید.

  3. یک دسته‌بند صفر-داده برای سگ و گربه بسازید. دو قالب پرامپت را امتحان کنید: a photo of a {class} و a picture of a {class}. دقت را روی 100 تصویر تست اندازه بگیرید. آیا ترکیب (ensemble) این قالب‌ها بهتر از حالت تکی عمل می‌کند؟

  4. هزینه‌ی ارتباطی سافت‌مکس InfoNCE را با زیان جفتی سیگموئید برای یک اجرای 512 پردازنده‌ای (GPU) با اندازه‌ی دسته‌ی 32k محاسبه کنید. کدام‌یک با مرتبه‌ی O(N)O(N) و کدام با O(N2)O(N^2) مقیاس می‌شود؟ به بخش 4 مقاله‌ی SigLIP استناد کنید.

  5. مقاله‌ی قوانین مقیاس‌پذیری OpenCLIP را بخوانید (arXiv:2212.07143، Cherti و همکاران). نتیجه‌گیری آن‌ها درباره‌ی مقیاس‌پذیری داده را از روی نمودارها بازتولید کنید: در اندازه‌ی مدل ثابت، رابطه‌ی لگاریتمی-خطی (log-linear) بین دقت صفر-داده در ImageNet و حجم داده‌ی آموزش چیست؟

اصطلاحات کلیدی

اصطلاح در گفتگوهای عامیانه معنای فنی دقیق
InfoNCE «تابع زیان کنتراستیو» آنتروپی متقاطع روی ماتریس شباهت یک دسته؛ هر نمونه فقط با جفت خودش مثبت است و با بقیه منفی
Sigmoid loss «زیان SigLIP» آنتروپی متقاطع دودوییِ جفت‌به‌جفت؛ بدون سافت‌مکس، بدون all-gather و با هزینه‌ی کم در آموزش توزیع‌شده
Temperature «همان tau» اسکالری که لاجیت‌ها را قبل از سافت‌مکس یا سیگموئید مقیاس‌بندی می‌کند؛ تیزی توزیع را کنترل می‌کند
Zero-shot «دسته‌بندی بدون فاین‌تیون» ساخت امبدینگ کلاس‌ها با پرامپت متنی و دسته‌بندی با شباهت کسینوسی؛ بدون آموزش روی کلاس‌های هدف
Prompt template «... a photo of a» قالب متنی اطراف نام کلاس؛ دقت دسته‌بندی صفر-داده را 1 تا 5 درصد جابه‌جا می‌کند
Dual encoder «مدل دوتایی یا Two-tower» یک انکودر تصویر + یک انکودر متن، با فضای خروجیِ مشترک D-بعدی
Hard negative «نمونه‌ی انحرافی سخت» داده‌ی منفی که شباهت زیادی به نمونه‌ی مثبت دارد و مدل باید برای تفکیک آن‌ها به زحمت بیفتد
Linear probe «فریز + یک لایه» آموزش فقط یک دسته‌بند خطی روی ویژگی‌های منجمد؛ ابزاری برای سنجش کیفیت فیچرها
NaFlex «رزولوشن انعطاف‌پذیر نیتیو» قابلیت SigLIP 2 در پذیرش تصاویر با هر نسبت ابعاد و رزولوشن، بدون نیاز به تغییر اندازه
Temperature scaling «پارامترسازی لگاریتمی tau» مدل‌سازی log(1/tau) در CLIP برای رفتار پایدار گرادیان‌ها، همراه با عملیات برش برای جلوگیری از فروپاشی به سمت صفر

برای مطالعه‌ی بیشتر

سؤالات متداول

چرا مدل SigLIP در آموزش توزیع‌شده مقیاس‌پذیری بهتری نسبت به CLIP دارد؟

مدل CLIP از تابع سافت‌مکس روی ماتریس شباهت استفاده می‌کند که نیازمند عملیات پرهزینه‌ی all-gather برای همگام‌سازی امبدینگ‌هاست. در مقابل، SigLIP مسئله را به دسته‌بندی‌های دودویی جفت‌به‌جفت با تابع سیگموئید تبدیل می‌کند که به ارتباط سنگین بین پردازنده‌ها نیاز ندارد.

دسته‌بندی صفر-داده (Zero-shot) در CLIP چگونه کار می‌کند؟

برای هر کلاس نام‌گذاری‌شده یک پرامپت متنی (مثل a photo of a {class}) ساخته و امبدینگ آن با انکودر متن استخراج می‌شود. سپس با انکودر تصویر امبدینگ عکس هدف به دست می‌آید و کلاسی که بیشترین شباهت کسینوسی را داشته باشد به عنوان پیش‌بینی خروجی داده می‌شود.

نقش پارامتر دما (tau) در تابع زیان InfoNCE چیست؟

دما تیزی توزیع احتمالاتی سافت‌مکس را کنترل می‌کند؛ مقادیر کوچک‌تر باعث توزیع تیزتر و توجه بیشتر به نمونه‌های انحرافی دشوار (hard negatives) می‌شوند و مقادیر بزرگ‌تر توزیع هموارتری ایجاد می‌کنند.

ما رو توی گوگل بیشتر ببین

با افزودن نکست ادمین به «منابع ترجیحی» گوگل، درس‌ها و مطالب ما را در بخش اخبار برتر جستجو بیشتر می‌بینید.