মেশিন লার্নিং গল্ফ: গুণ


68

আমি এই সম্প্রদায়ের কাছে বিভিন্ন ধরণের গল্ফ চ্যালেঞ্জ প্রস্তাব করতে চাই:

(কৃত্রিম) নিউরাল নেটওয়ার্কগুলি খুব জনপ্রিয় মেশিন লার্নিং মডেল যা কোনও প্রদত্ত (সাধারণত অজানা) ফাংশনটিকে আনুমানিক রূপে ডিজাইন এবং প্রশিক্ষণ দেওয়া যায়। এগুলি প্রায়শই অত্যন্ত জটিল সমস্যাগুলি সমাধান করার জন্য ব্যবহৃত হয় যা আমরা জানি না কীভাবে আলগোরিদমিকভাবে বক্তৃতা স্বীকৃতি, নির্দিষ্ট ধরণের চিত্রের শ্রেণিবিন্যাস, স্বায়ত্তশাসিত ড্রাইভিং সিস্টেমের বিভিন্ন কাজগুলি সমাধান করা যায় ... স্নায়বিক নেটওয়ার্কগুলির একটি প্রাইমারের জন্য, এই দুর্দান্ত বিবেচনা করুন উইকিপিডিয়া নিবন্ধ

যেহেতু আমি মেশিন লার্নিং গল্ফ চ্যালেঞ্জগুলির একটি সিরিজ হওয়ার আশা করি তার মধ্যে এটিই প্রথম, আমি যতটা সম্ভব জিনিসগুলি সহজ রাখতে চাই:

আপনার পছন্দের ভাষা এবং কাঠামোতে, একটি নিউরাল নেটওয়ার্ক ডিজাইন করুন এবং প্রশিক্ষণ দিন যা প্রদত্ত (x1,x2) তাদের পণ্য x1x2 সমস্ত পূর্ণসংখ্যার জন্য x1,x2 (এবং সহ) 10 এবং 10 জন্য গণনা করে ।

পারফরম্যান্স গোল

যোগ্যতা অর্জনের জন্য, আপনার মডেল সেই সমস্ত এন্ট্রিগুলির সঠিক ফলাফল থেকে 0.5 বেশি বিচ্যুত হতে পারে না ।

বিধি

আপনার মডেল

  • অবশ্যই একটি 'traditionalতিহ্যবাহী' নিউরাল নেটওয়ার্ক হতে হবে (একটি নোডের মান পূর্ববর্তী স্তরের কয়েকটি নোডের একটি ভারীকরণ রৈখিক সংমিশ্রণ হিসাবে একটি অ্যাক্টিভেশন ফাংশন দ্বারা অনুসরণ করা হয়),
  • কেবলমাত্র নিম্নলিখিত মানক অ্যাক্টিভেশন ফাংশন ব্যবহার করতে পারে:
    1. linear(x)=x ,
    2. softmax(x)i=exijexj ,
    3. seluα,β(x)={βx, if x>0αβ(ex1), otherwise ,
    4. softplus(x)=ln(ex+1) ,
    5. leaky-reluα(x)={x, if x<0αx, otherwise ,
    6. tanh(x) ,
    7. sigmoid(x)=exex+1 ,
    8. hard-sigmoid(x)={0, if x<2.51, if x>2.50.2x+0.5, otherwise ,
    9. ex
  • (x1,x2) একটি পূর্ণরূপ / ভেক্টর / তালিকা / ... হিসাবে নেওয়া উচিত বা এর একমাত্র ইনপুট হিসাবে ভাসমান,
  • উত্তরটি পূর্ণসংখ্যার হিসাবে ফেরত করুন, ভাসাবেন (বা উপযুক্ত ধারক, যেমন ভেক্টর বা তালিকা, যাতে এই উত্তর রয়েছে)।

আপনার উত্তরগুলিতে অবশ্যই আপনার ফলাফল যাচাই করতে প্রয়োজনীয় সমস্ত কোড অন্তর্ভুক্ত করতে হবে (বা এর সাথে লিঙ্ক) - আপনার মডেলের প্রশিক্ষিত ওজন সহ।

স্কোরিং

সর্বাধিক সংখ্যক ওজনের (নিউট্রিয়াল ওয়েট সহ) নিউরাল নেটওয়ার্ক জিতেছে।

উপভোগ করুন!


9
সাইটে স্বাগতম! আমি মনে করি যে এই চ্যালেঞ্জটি একটি নিউরাল নেটওয়ার্কের আরও দৃ definition় সংজ্ঞা থেকে একটি ভাল চুক্তিতে উপকৃত হতে পারে। এখানে বেশ কয়েকটি জিনিস রয়েছে 1) আপনার পক্ষে এটি এমন ভাষায় বলা ভাল হবে যা ইতিমধ্যে এনএনএস সম্পর্কে জ্ঞান বোঝায় না 2) আপনার বাহ্যিক উত্সের সাথে লিঙ্ক না করে সত্যই আপনার পোস্টে সক্রিয়করণ ফাংশনগুলি তালিকা করা উচিত ( বাইরের লিঙ্কগুলি পরিবর্তন বা অদৃশ্য হয়ে যেতে পারে)।
গম উইজার্ড

4
আমরা কী ওজনগুলি পুনরায় ব্যবহার করতে / কনভোলজিনাল স্তরগুলি ব্যবহার করতে পারি? (আমি বোনাস অপসারণের পরামর্শ দিচ্ছি, কারণ এটি চ্যালেঞ্জের কোনও কিছুই যোগ করে না এবং কেবল মূল লক্ষ্য থেকে দূরে সরে যায়।) ওজনগুলি কি আসল বলে মনে করা হয় বা এগুলি জটিল হতে পারে?
flawr

4
আপনার শব্দটি স্তর 3 থেকে নোডগুলি বোঝায় যে স্তর 1 থেকে ইনপুটগুলি ব্যবহার করতে পারবেন না 1 লেপ 2 নোডটি কেবল f(x) = xতার ইনপুট ফরোয়ার্ড করার জন্য কি কোনও ওজন ব্যয় করে ?
গ্রিমি

4
স্যান্ডবক্সের ডান কলামে একটি লিঙ্ক থাকা উচিত, যা এই ধরণের সমস্যাগুলি মূল সাইটটিতে পোস্ট করার আগেই স্পষ্টভাবে তৈরি করা হয়েছিল। এবং নেটওয়ার্ক দর্শনটি হ'ল কোনও প্রশ্ন বন্ধ করা, সংশোধন করা এবং এটি পুনরায় খোলা উত্তোলনের চেয়ে একগুচ্ছ উত্তর পাওয়ার চেয়ে ভাল যা প্রশ্নটি স্থির হওয়ার পরে কোনও ধারণা দেবে না বা প্রশ্নে যে পরিবর্তনগুলি হতে পারে তা দৃ tight়ভাবে সীমাবদ্ধ করবে ।
পিটার টেলর 16

7
একদমই না. এই ধরণের সমস্যাগুলি বহু বছরের অভিজ্ঞতার দ্বারা অন্য লোকেরা একই ধরণের ভুল করতে দেখে সনাক্ত করা হয়। কিছু অস্পষ্টতা স্যান্ডবক্স পেরিয়ে যায় তবে আরও অনেকগুলি সেখানে ধরা পড়ে। এবং এটি অবশ্যই ধরা পড়েছিল, কারণ আমার প্রথম মন্তব্যে ইঙ্গিত হিসাবে আমরা দুই মাস আগে একটি নিউরাল নেট প্রশ্নটি নিয়ে ঠিক একই সমস্যা ছিল ।
পিটার টেলর 16

উত্তর:


37

21 13 11 9 ওজন

এটি বিলিনিয়ার ফর্মগুলির মেরুকরণ পরিচয়ের উপর ভিত্তি করে যা এক মাত্রিক আসল ক্ষেত্রে বহুবর্ষীয় পরিচয় হ্রাস করে:

xy=(x+y)2(xy)24

সুতরাং y1কেবল [x+y, x-y]একটি রৈখিক রূপান্তর ব্যবহার করে গণনা করা, এবং পরেরটির জন্য একটি প্রাকপ্রসেসিং পদক্ষেপ হিসাবে y3এর পরম মান y1: তারপরে "শক্ত" অংশটি আমি নীচে ব্যাখ্যা করব এমন স্কোয়ারগুলি গণনা করছি, এবং তার পরে কেবল একটি পার্থক্য গণনা এবং স্কেলিং যা আবার লিনিয়ার অপারেশন।

s{0,1,2,,20}0.5

approx_square(x)=i=02wiexp(0.0001ix)

W2=(wi)i0.02

function p = net(x)
% 9 weights
one = 1; 
mone =-1;
zero = 0;
fourth = 0.25;
W1 = [1e-4, 2e-4];
W2  = [-199400468.100687;99700353.6313757];
b2 = 99700114.4299316;
leaky_relu = @(a,x)max(a*x,x); 


% Linear
y0 = [one, one; one, mone] * x;

% Linear + ReLU
y1 = mone * y0;
y2 = [leaky_relu(zero, y0), leaky_relu(zero, y1)];

% Linear
y3 = y2 * [one; one];

% Linear + exp
y4 = exp(y3 * W1); 

% Linear + Bias
y5 =  y4 * W2 + b2;

% Linear
y6 = [one, mone]*y5;
p = y6 * fourth;

end

এটি অনলাইন চেষ্টা করুন!


আমি মনে করি আপনার টিআইও লিঙ্কের পাদদেশে থাকা চেকিং কোডটি একটি অ্যাপ্লিকেশন মিস করে abs। তবে সবকিছু ঠিক আছে।
খ্রিস্টান সিভর্স

@ খ্রিস্টিয়ানসিভার্স ধন্যবাদ, আমি টিআইও লিঙ্কটি আপডেট করেছি!
flawr

আমি এনএন-তে বিশেষজ্ঞ নই, কৌতূহলের বাইরে, ওজন গণনা কীভাবে করা হয়? y04 দরকার, y12 টি দরকার, y32 টি y4দরকার, 1 টি y5দরকার, 1 টি y6প্রয়োজন এবং 2 প্রয়োজন? এটি 12?
মার্গারেট ব্লুম

3
@ মার্গারেটব্লুম হ্যাঁ এটি আসলে কিছুটা অস্বাভাবিক, তবে ওপি মন্তব্যগুলিতে বলেছিল যে আমরা ওজন পুনরায় ব্যবহার করতে পারি এবং কেবল একবারে ওজন গণনা করতে হবে, এমনকি যদি আমরা একই ওজন একাধিকবার ব্যবহার করি তবে। সুতরাং আমি সমস্ত ওজন ব্যবহার করছি ফাংশনের প্রথম অংশে সংজ্ঞায়িত করা হয়।
flawr

31

7 ওজন

eps = 1e-6
c = 1 / (2 * eps * eps)

def f(A, B):
	e_s = exp(eps * A + eps * B)  # 2 weights, exp activation
	e_d = exp(eps * A - eps * B)  # 2 weights, exp activation
	return c * e_s + (-c) * e_d + (-1 / eps) * B  # 3 weights, linear activation

এটি অনলাইন চেষ্টা করুন!

ϵex1+x+x22

ABeϵA+ϵBeϵAϵB2ϵ2Bϵ

ϵepsc


1
নিশ্চিত নন যে এটি একটি 'traditionalতিহ্যবাহী নিউরাল নেটওয়ার্ক' (নিয়ম # 1) হিসাবে গণ্য হয়েছে তবে এটি স্পষ্টতই এটি পুনরায় ফর্ম্যাট করা যেতে পারে তাই এটি নিয়ে আমি কোনও সমস্যা দেখছি না। চমৎকার সমাধান!
স্টিফান মেসকেন

1
আপনি C = -B(1 ওজন) সংজ্ঞায়িত করতে পারেন এবং তারপরে [e_s, e_d] = conv([A,B,C], [eps, eps])একটি ওজন বাঁচাতে (2 ওজন) রাখতে পারেন :) (
বিটিডাব্লু

(আমি যুক্ত করতে ভুলে exp
গিয়েছি

4
এমনকি ওজন পুনরায় ব্যবহার করে আপনি অনেক কম পেতে পারেন - আপনাকে একাধিকবার একই ওজন গণনা করতে হবে না।
flawr

2
@ ফ্লোয়ার এটি একটি দুর্দান্ত কৌশল, তবে আমি মনে করি মন্তব্যে বোঝা ও ওজন পুনরায় ব্যবহারের জন্য ভাতা এটিকে এতো আলাদা চ্যালেঞ্জ করে তোলে যে আমি এই উত্তরটি যেমন রাখছি তাই চলেছি।
xnor

22

33 31 ওজন

# Activation functions
sub hard { $_[0] < -2.5 ? 0 : $_[0] > 2.5 ? 1 : 0.2 * $_[0] + 0.5 }
sub linear { $_[0] }

# Layer 0
sub inputA() { $a }
sub inputB() { $b }

# Layer 1
sub a15() { hard(5*inputA) }

# Layer 2
sub a8()  { hard(-5*inputA + 75*a15 - 37.5) }

# Layer 3
sub aa()  { linear(-5*inputA + 75*a15 - 40*a8) }

# Layer 4
sub a4()  { hard(aa - 17.5) }

# Layer 5
sub a2()  { hard(aa - 20*a4 - 7.5) }

# Layer 6
sub a1()  { linear(0.2*aa - 4*a4 - 2*a2) }

# Layer 7
sub b15() { hard(0.25*inputB - 5*a15) }
sub b8()  { hard(0.25*inputB - 5*a8) }
sub b4()  { hard(0.25*inputB - 5*a4) }
sub b2()  { hard(0.25*inputB - 5*a2) }
sub b1()  { hard(0.25*inputB - 5*a1) }

# Layer 8
sub output() { linear(-300*b15 + 160*b8 + 80*b4 + 40*b2 + 20*b1 - 10*inputA) }

# Test
for $a (-10..10) {
        for $b (-10..10) {
                die if abs($a * $b - output) >= 0.5;
        }
}

print "All OK";

এটি অনলাইন চেষ্টা করুন!

এটি (সার্টা) বাইনারিগুলিতে দীর্ঘ গুণ করে এবং এর ফলে সঠিক ফলাফল দেয়। এটি আরও কিছুটা গল্ফ করার জন্য 0.5 টি ত্রুটি উইন্ডোটির সুবিধা নেওয়া সম্ভব হবে তবে আমি কীভাবে তা নিশ্চিত নই।

স্তরগুলি 1 থেকে 6 প্রথম ইনপুটটি 5 "বিটস" এ পচে যায়। গল্ফিং কারণে আমরা প্রকৃত বাইনারি ব্যবহার করি না। সর্বাধিক উল্লেখযোগ্য "বিট" এর ওজন 16-এর পরিবর্তে -15 হয় এবং ইনপুট 0 হলে সমস্ত "বিট" 0.5 হয় (যা এখনও সূক্ষ্মভাবে কাজ করে, কারণ এটি পরিচয় সংরক্ষণ করে inputA = -15*a15 + 8*a8 + 4*a4 + 2*a2 + 1*a1)।


1
আমি প্রত্যাশা করেছি যে কেউ কঠোর কোডেড, এএনএন-আইফাইড গুণিত অ্যালগরিদম নিয়ে আসবেন। তবে আমি ভাবিনি যে এটি প্রথম প্রতিক্রিয়া হবে। সাবাশ! (আপনি এমএনআইএসটি ডেটাসেট বা অন্য কোনও আপেক্ষিক এমএল সমস্যা: ডি দ্বারা এই জাতীয় কিছু টানতে সক্ষম হবেন কিনা তা জানতেও আমি আগ্রহী)
স্টিফান মেসকেন

14

43 ওজন

এখনও অবধি পোস্ট দুটি সমাধান খুব চালাক ছিল তবে তাদের পদ্ধতির সম্ভবত মেশিন লার্নিংয়ে (ওসিআরের মতো) আরও traditionalতিহ্যবাহী কাজের জন্য কাজ করা হবে না। তাই আমি এই কাজের একটি 'জেনেরিক' (কোনও চালাক কৌশল নয়) সমাধান জমা দিতে চাই যা আশাবাদী অন্যান্য লোককে এটির উন্নতি করতে এবং মেশিন লার্নিংয়ের জগতে চুষতে অনুপ্রাণিত করে:

আমার মডেলটি টেনসরফ্লো ২.০ এ নির্মিত দুটি লুকানো স্তর সহ একটি খুব সাধারণ নিউরাল নেটওয়ার্ক (তবে অন্য কোনও কাঠামোও কাজ করবে):

model = tf.keras.models.Sequential([
tf.keras.layers.Dense(6, activation='tanh', input_shape=(2,)),
tf.keras.layers.Dense(3, activation='tanh'),
tf.keras.layers.Dense(1, activation='linear')
])

আপনি দেখতে পাচ্ছেন, সমস্ত স্তরগুলি ঘন (যা অবশ্যই সর্বোত্তম নয়), অ্যাক্টিভেশন ফাংশনটি তানহ (যা আসলে এই টাস্কটির পক্ষে ঠিক আছে), আউটপুট স্তর ব্যতীত, এই কাজের প্রকৃতির কারণে, লিনিয়ার অ্যাক্টিভেশন ফাংশন রয়েছে।

43 টি ওজন রয়েছে:

  • (2+1)6=18
  • (6+1)3=21
  • (3+1)1=4

1010

এরপরে, আমি এগুলি সংক্ষিপ্ত করে রেখেছি - পূর্ণসংখ্যার কোনও গুণকে সর্বাধিক বিচরণের জন্য অনুকূল করে তুলেছি। দুর্ভাগ্যক্রমে, আমার নোটগুলি খুব সূক্ষ্ম সুরটি প্রদর্শন করে না আমি শেষ করেছিলাম, তবে এটি খুব সামান্য ছিল। ৪৪১ টি ব্যাচের আকারের, সেই 441 প্রশিক্ষণের নমুনাগুলিতে 100 যুগের আশেপাশে।

এই ওজনগুলি আমি শেষ করে দিয়েছি:

[<tf.Variable 'dense/kernel:0' shape=(2, 6) dtype=float32, numpy=
 array([[ 0.10697944,  0.05394982,  0.05479664, -0.04538541,  0.05369904,
         -0.0728976 ],
        [ 0.10571832,  0.05576797, -0.04670485, -0.04466859, -0.05855528,
         -0.07390639]], dtype=float32)>,
 <tf.Variable 'dense/bias:0' shape=(6,) dtype=float32, numpy=
 array([-3.4242163, -0.8875816, -1.7694025, -1.9409281,  1.7825342,
         1.1364107], dtype=float32)>,
 <tf.Variable 'dense_1/kernel:0' shape=(6, 3) dtype=float32, numpy=
 array([[-3.0665843 ,  0.64912266,  3.7107112 ],
        [ 0.4914808 ,  2.1569328 ,  0.65417236],
        [ 3.461693  ,  1.2072319 , -4.181983  ],
        [-2.8746269 , -4.9959164 ,  4.505049  ],
        [-2.920127  , -0.0665407 ,  4.1409926 ],
        [ 1.3777553 , -3.3750365 , -0.10507642]], dtype=float32)>,
 <tf.Variable 'dense_1/bias:0' shape=(3,) dtype=float32, numpy=array([-1.376577  ,  2.8885336 ,  0.19852689], dtype=float32)>,
 <tf.Variable 'dense_2/kernel:0' shape=(3, 1) dtype=float32, numpy=
 array([[-78.7569  ],
        [-23.602606],
        [ 84.29587 ]], dtype=float32)>,
 <tf.Variable 'dense_2/bias:0' shape=(1,) dtype=float32, numpy=array([8.521169], dtype=float32)>]

0.44350433910=90.443504

আমার মডেলটি এখানে পাওয়া যাবে এবং আপনি এটি অনলাইনেও দেখতে পারেন ! গুগল কুলাব পরিবেশে।


6

2 ওজন

ϵ>0

xyeϵx+ϵy+eϵxϵyeϵxϵyeϵx+ϵy4ϵ2.

ϵ=0.01

{±ϵ,±(4ϵ2)1}{±ϵ,(4ϵ3)1}±(4ϵ2)1=±ϵ(4ϵ3)1। আমি উপরে একটি মন্তব্যে উল্লেখ করেছি যে, মেশিন যথার্থতার সাথে ওজনযুক্ত প্রতিটি নিউরাল নেট কেবল দুটি স্বতন্ত্র ওজন সহ একটি (বিশাল!) নিউরাল নেট থেকে গল্ফ করা যেতে পারে। নিম্নলিখিত ম্যাটল্যাব কোডটি লিখতে আমি এই পদ্ধতিটি প্রয়োগ করেছি:

function z=approxmultgolfed(x,y)

w1 = 0.1;   % first weight
w2 = -w1;   % second weight

k  = 250000;
v1 = w1*ones(k,1);
v2 = w2*ones(k,1);

L1 = w1*eye(2);
L2 = [ w1 w1; w2 w2; w1 w2; w2 w1 ];
L3 = [ v1 v1 v2 v2 ];
L4 = v1';

z = L4 * L3 * exp( L2 * L1 * [ x; y ] );

{±0.1}

কীভাবে কীভাবে মাত্র 1 ওজন (!) দিয়ে পালাবেন

{±0.1}0.10.1

0.1x=wwx,

w100.110.5

{±10k}10k

(সম্ভবত আমাদের ভবিষ্যতে নিউরাল নেট গল্ফিং চ্যালেঞ্জগুলিতে পুনরায় ব্যবহৃত ওজন কীভাবে স্কোর করা হয় তা সংশোধন করা উচিত))

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.