হুড অধীনে গ্রাফ মনোযোগ নেটওয়ার্ক

উত্স নোড: 769288

গ্রাফ মনোযোগ নেটওয়ার্ক

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

[..] এই পদ্ধতিগুলি বিভিন্ন নোডগুলিকে তথ্য আদান-প্রদান করার অনুমতি দেয় গ্রাফে পাস করা কিছু বার্তার উপর ভিত্তি করে।

গ্রাফগুলিতে নির্দিষ্ট কাজগুলি সম্পন্ন করার জন্য (নোডের শ্রেণিবিন্যাস, লিঙ্কের পূর্বাভাস, ইত্যাদি), একটি GNN স্তর তথাকথিত মাধ্যমে নোড এবং প্রান্তের উপস্থাপনা গণনা করে। পুনরাবৃত্ত প্রতিবেশী বিস্তার (অথবা বার্তা পাস) এই নীতি অনুসারে, প্রতিটি গ্রাফ নোড স্থানীয় গ্রাফ কাঠামোর প্রতিনিধিত্ব করার জন্য তার প্রতিবেশীদের কাছ থেকে বৈশিষ্ট্যগুলি গ্রহণ করে এবং একত্রিত করে: বিভিন্ন ধরনের GNN স্তরগুলি বিভিন্ন একত্রীকরণ কৌশল সম্পাদন করে।

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

আপনি যদি GNN এবং সম্পর্কিত ধারণাগুলিতে সম্পূর্ণ নতুন হন, আমি আপনাকে নিম্নলিখিত পরিচায়ক নিবন্ধটি পড়ার জন্য আমন্ত্রণ জানাচ্ছি: গ্রাফ নিউরাল নেটওয়ার্কের বিল্ডিং ব্লক বোঝা (পরিচয়).

যদি এই গভীর-শিক্ষামূলক সামগ্রী আপনার জন্য দরকারী, আমাদের এআই গবেষণা মেলিং তালিকার সাবস্ক্রাইব করুন সতর্কতা অবলম্বন করার জন্য যখন আমরা নতুন উপাদান প্রকাশ করি। 

GCN বনাম GAT — ম্যাথ ওয়ার্ম-আপ

এই ওয়ার্ম-আপটি ডিপ গ্রাফ লাইব্রেরি দ্বারা রিপোর্ট করা GAT বিবরণের উপর ভিত্তি করে ওয়েবসাইট.

GAT স্তরের আচরণ বোঝার আগে, আসুন GCN স্তর দ্বারা সম্পাদিত একত্রিতকরণের পিছনের গণিতটি পুনরুদ্ধার করি।

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

GAT স্তর GCN স্তরের মৌলিক একত্রীকরণ ফাংশনকে প্রসারিত করে, মনোযোগ সহগগুলির মাধ্যমে প্রতিটি প্রান্তকে আলাদা গুরুত্ব প্রদান করে।

GAT স্তর সমীকরণ
  • সমীকরণ (1) নিম্ন স্তর এমবেডিং এর একটি রৈখিক রূপান্তর ওহে, এবং W এটা শেখার যোগ্য ওজন ম্যাট্রিক্স. এই রূপান্তরটি ইনপুট বৈশিষ্ট্যগুলিকে উচ্চ-স্তরের এবং ঘন বৈশিষ্ট্যগুলিতে রূপান্তর করার জন্য পর্যাপ্ত অভিব্যক্তিপূর্ণ শক্তি অর্জনে সহায়তা করে।
  • সমীকরণ (2) দুই প্রতিবেশীর মধ্যে একটি জোড়া-ভিত্তিক অ-স্বাভাবিক মনোযোগ স্কোর গণনা করে। এখানে, এটি প্রথমে সংযুক্ত করে z দুটি নোডের এমবেডিং, যেখানে || সংমিশ্রণ বোঝায়। তারপর, এটি এই ধরনের সংমিশ্রণের একটি বিন্দু পণ্য এবং একটি শেখার যোগ্য ওজন ভেক্টর লাগে a. শেষ পর্যন্ত, ডট পণ্যের ফলাফলে একটি LeakyReLU প্রয়োগ করা হয়। মনোযোগ স্কোর বার্তা পাসিং কাঠামোতে একটি প্রতিবেশী নোডের গুরুত্ব নির্দেশ করে।
  • সমীকরণ (3) প্রতিটি নোডের আগত প্রান্তে মনোযোগ স্কোর স্বাভাবিক করার জন্য একটি সফটম্যাক্স প্রয়োগ করে। সফটম্যাক্স একটি সম্ভাব্যতা বন্টনে পূর্ববর্তী ধাপের আউটপুটকে এনকোড করে। ফলস্বরূপ, মনোযোগের স্কোরগুলি বিভিন্ন নোড জুড়ে অনেক বেশি তুলনীয়।
  • সমীকরণ (4) GCN সমষ্টির অনুরূপ (বিভাগের শুরুতে সমীকরণ দেখুন)। প্রতিবেশীদের থেকে এমবেডিংগুলিকে একত্রিত করা হয়, মনোযোগের স্কোর দ্বারা মাপানো হয়৷ এই স্কেলিং প্রক্রিয়ার প্রধান পরিণতি হল প্রতিটি আশেপাশের নোড থেকে একটি ভিন্ন অবদান শেখা।

NumPy বাস্তবায়ন

প্রথম ধাপ হল একটি সরল গ্রাফ উপস্থাপন এবং রৈখিক রূপান্তর সম্পাদন করার জন্য উপাদান (ম্যাট্রিস) প্রস্তুত করা।

NumPy কোড

print('nn----- One-hot vector representation of nodes. Shape(n,n)n')
X = np.eye(5, 5)
n = X.shape[0]
np.random.shuffle(X)
print(X) print('nn----- Embedding dimensionn')
emb = 3
print(emb) print('nn----- Weight Matrix. Shape(emb, n)n')
W = np.random.uniform(-np.sqrt(1. / emb), np.sqrt(1. / emb), (emb, n))
print(W) print('nn----- Adjacency Matrix (undirected graph). Shape(n,n)n')
A = np.random.randint(2, size=(n, n))
np.fill_diagonal(A, 1) A = (A + A.T)
A[A > 1] = 1
print(A)

আউটপুট

----- One-hot vector representation of nodes. Shape(n,n)
[[0 0 1 0 0] # node 1 [0 1 0 0 0] # node 2 [0 0 0 0 1] [1 0 0 0 0] [0 0 0 1 0]]
----- Embedding dimension
3
----- Weight Matrix. Shape(emb, n)
[[-0.4294049 0.57624235 -0.3047382 -0.11941829 -0.12942953] [ 0.19600584 0.5029172 0.3998854 -0.21561317 0.02834577] [-0.06529497 -0.31225734 0.03973776 0.47800217 -0.04941563]]
----- Adjacency Matrix (undirected graph). Shape(n,n)
[[1 1 1 0 1] [1 1 1 1 1] [1 1 1 1 0] [0 1 1 1 1] [1 1 0 1 1]]

প্রথম ম্যাট্রিক্স নোডগুলির একটি এক-হট এনকোডেড উপস্থাপনা সংজ্ঞায়িত করে (নোড 1 গাঢ়ভাবে দেখানো হয়েছে)। তারপরে, আমরা একটি ওজন ম্যাট্রিক্স সংজ্ঞায়িত করি, সংজ্ঞায়িত এমবেডিং মাত্রাকে কাজে লাগিয়ে। আমি এর 3য় কলাম ভেক্টর হাইলাইট করেছি W কারণ, আপনি শীঘ্রই দেখতে পাবেন, এই ভেক্টরটি নোড 1-এর আপডেটেড উপস্থাপনাকে সংজ্ঞায়িত করে (একটি 1-মান 3য় অবস্থানে শুরু করা হয়)। এই উপাদানগুলি থেকে শুরু করে নোড বৈশিষ্ট্যগুলির জন্য পর্যাপ্ত অভিব্যক্তিপূর্ণ শক্তি অর্জন করতে আমরা রৈখিক রূপান্তর করতে পারি। এই পদক্ষেপের লক্ষ্য হল (এক-হট এনকোডেড) ইনপুট বৈশিষ্ট্যগুলিকে একটি নিম্ন এবং ঘন প্রতিনিধিত্বে রূপান্তর করা।

GAT স্তর (সমীকরণ 1)

NumPy কোড

# equation (1)
print('nn----- Linear Transformation. Shape(n, emb)n')
z1 = X.dot(W.T)
print(z1)

আউটপুট

----- Linear Transformation. Shape(n, emb) [[-0.3047382 0.3998854 0.03973776] [ 0.57624235 0.5029172 -0.31225734] [-0.12942953 0.02834577 -0.04941563] [-0.4294049 0.19600584 -0.06529497] [-0.11941829 -0.21561317 0.47800217]]

পরবর্তী অপারেশন প্রতিটি প্রান্তের জন্য স্ব-মনোযোগ সহগ প্রবর্তন করা হয়। আমরা উৎস নোডের উপস্থাপনা এবং প্রান্তের প্রতিনিধিত্বের জন্য গন্তব্য নোডের উপস্থাপনাকে সংযুক্ত করি। এই সংযোজন প্রক্রিয়া সংলগ্ন ম্যাট্রিক্স দ্বারা সক্রিয় করা হয়েছে A, যা গ্রাফের সমস্ত নোডের মধ্যে সম্পর্ক সংজ্ঞায়িত করে।

GAT স্তর (সমীকরণ 2)

NumPy কোড

# equation (2) - First part
print('nn----- Concat hidden features to represent edges. Shape(len(emb.concat(emb)), number of edges)n')
edge_coords = np.where(A==1)
h_src_nodes = z1[edge_coords[0]]
h_dst_nodes = z1[edge_coords[1]]
z2 = np.concatenate((h_src_nodes, h_dst_nodes), axis=1)

আউটপুট

----- Concat hidden features to represent edges. Shape(len(emb.concat(emb)), number of edges) [[-0.3047382 0.3998854 0.03973776 -0.3047382 0.3998854 0.03973776] [-0.3047382 0.3998854 0.03973776 0.57624235 0.5029172 -0.31225734] [-0.3047382 0.3998854 0.03973776 -0.12942953 0.02834577 -0.04941563] [-0.3047382 0.3998854 0.03973776 -0.11941829 -0.21561317 0.47800217] [ 0.57624235 0.5029172 -0.31225734 -0.3047382 0.3998854 0.03973776] [ 0.57624235 0.5029172 -0.31225734 0.57624235 0.5029172 -0.31225734] [ 0.57624235 0.5029172 -0.31225734 -0.12942953 0.02834577 -0.04941563] [ 0.57624235 0.5029172 -0.31225734 -0.4294049 0.19600584 -0.06529497] [ 0.57624235 0.5029172 -0.31225734 -0.11941829 -0.21561317 0.47800217] [-0.12942953 0.02834577 -0.04941563 -0.3047382 0.3998854 0.03973776] [-0.12942953 0.02834577 -0.04941563 0.57624235 0.5029172 -0.31225734] [-0.12942953 0.02834577 -0.04941563 -0.12942953 0.02834577 -0.04941563] [-0.12942953 0.02834577 -0.04941563 -0.4294049 0.19600584 -0.06529497] [-0.4294049 0.19600584 -0.06529497 0.57624235 0.5029172 -0.31225734] [-0.4294049 0.19600584 -0.06529497 -0.12942953 0.02834577 -0.04941563] [-0.4294049 0.19600584 -0.06529497 -0.4294049 0.19600584 -0.06529497] [-0.4294049 0.19600584 -0.06529497 -0.11941829 -0.21561317 0.47800217] [-0.11941829 -0.21561317 0.47800217 -0.3047382 0.3998854 0.03973776] [-0.11941829 -0.21561317 0.47800217 0.57624235 0.5029172 -0.31225734] [-0.11941829 -0.21561317 0.47800217 -0.4294049 0.19600584 -0.06529497] [-0.11941829 -0.21561317 0.47800217 -0.11941829 -0.21561317 0.47800217]]

পূর্ববর্তী ব্লকে, আমি নোড 4 এর সাথে সংযুক্ত 4টি ইন-এজকে প্রতিনিধিত্বকারী 1টি সারি হাইলাইট করেছি। প্রতিটি সারির প্রথম 3টি উপাদান নোড 1 প্রতিবেশীর এমবেডিং উপস্থাপনাকে সংজ্ঞায়িত করে, যেখানে প্রতিটি সারির অন্য 3টি উপাদান নোড 1-এর সাথে সংযুক্ত এম্বেডিংগুলিকে সংজ্ঞায়িত করে নোড XNUMX নিজেই (যেমন আপনি লক্ষ্য করতে পারেন, প্রথম সারিটি একটি স্ব-লুপ এনকোড করে)।

এই ক্রিয়াকলাপের পরে, আমরা মনোযোগ সহগগুলি প্রবর্তন করতে পারি এবং সংযুক্তকরণ প্রক্রিয়ার ফলে, প্রান্তের প্রতিনিধিত্বের সাথে তাদের গুণ করতে পারি। অবশেষে, Leaky Relu ফাংশন এই পণ্যের আউটপুট প্রয়োগ করা হয়.

NumPy কোড

# equation (2) - Second part
print('nn----- Attention coefficients. Shape(1, len(emb.concat(emb)))n')
att = np.random.rand(1, z2.shape[1])
print(att) print('nn----- Edge representations combined with the attention coefficients. Shape(1, number of edges)n')
z2_att = z2.dot(att.T)
print(z2_att) print('nn----- Leaky Relu. Shape(1, number of edges)')
e = leaky_relu(z2_att)
print(e)

আউটপুট

----- Attention coefficients. Shape(1, len(emb.concat(emb))) [[0.09834683 0.42110763 0.95788953 0.53316528 0.69187711 0.31551563]] ----- Edge representations combined with the attention coefficients. Shape(1, number of edges) [[ 0.30322275] [ 0.73315639] [ 0.11150219] [ 0.11445879] [ 0.09607946] [ 0.52601309] [-0.0956411 ] [-0.14458757] [-0.0926845 ] [ 0.07860653] [ 0.50854017] [-0.11311402] [-0.16206049] [ 0.53443082] [-0.08722337] [-0.13616985] [-0.08426678] [ 0.48206613] [ 0.91199976] [ 0.2413991 ] [ 0.29330217]] ----- Leaky Relu. Shape(1, number of edges)
[[ 3.03222751e-01] [ 7.33156386e-01] [ 1.11502195e-01] [ 1.14458791e-01] [ 9.60794571e-02] [ 5.26013092e-01] [-9.56410988e-04] [-1.44587571e-03] [-9.26845030e-04] [ 7.86065337e-02] [ 5.08540169e-01] [-1.13114022e-03] [-1.62060495e-03] [ 5.34430817e-01] [-8.72233739e-04] [-1.36169846e-03] [-8.42667781e-04] [ 4.82066128e-01] [ 9.11999763e-01] [ 2.41399100e-01] [ 2.93302168e-01]]

এই প্রক্রিয়ার শেষে, আমরা গ্রাফের প্রতিটি প্রান্তের জন্য একটি ভিন্ন স্কোর অর্জন করেছি। উপরের ব্লকে, আমি প্রথম প্রান্তের সাথে যুক্ত সহগটির বিবর্তন তুলে ধরেছি। তারপর, বিভিন্ন নোড জুড়ে সহগকে সহজে তুলনীয় করতে, প্রতিটি গন্তব্য নোডের জন্য সমস্ত প্রতিবেশীর অবদানে একটি সফটম্যাক্স ফাংশন প্রয়োগ করা হয়।

GAT স্তর (সমীকরণ 3)

NumPy কোড

# equation (3)
print('nn----- Edge scores as matrix. Shape(n,n)n')
e_matr = np.zeros(A.shape)
e_matr[edge_coords[0], edge_coords[1]] = e.reshape(-1,)
print(e_matr) print('nn----- For each node, normalize the edge (or neighbor) contributions using softmaxn')
alpha0 = softmax(e_matr[:,0][e_matr[:,0] != 0]) alpha1 = softmax(e_matr[:,1][e_matr[:,1] != 0])
alpha2 = softmax(e_matr[:,2][e_matr[:,2] != 0])
alpha3 = softmax(e_matr[:,3][e_matr[:,3] != 0])
alpha4 = softmax(e_matr[:,4][e_matr[:,4] != 0])
alpha = np.concatenate((alpha0, alpha1, alpha2, alpha3, alpha4))
print(alpha) print('nn----- Normalized edge score matrix. Shape(n,n)n')
A_scaled = np.zeros(A.shape)
A_scaled[edge_coords[0], edge_coords[1]] = alpha.reshape(-1,)
print(A_scaled)

আউটপুট

----- Edge scores as matrix. Shape(n,n) [[ 3.03222751e-01 7.33156386e-01 1.11502195e-01 0.00000000e+00 1.14458791e-01] [ 9.60794571e-02 5.26013092e-01 -9.56410988e-04 -1.44587571e-03 -9.26845030e-04] [ 7.86065337e-02 5.08540169e-01 -1.13114022e-03 -1.62060495e-03 0.00000000e+00] [ 0.00000000e+00 5.34430817e-01 -8.72233739e-04 -1.36169846e-03 -8.42667781e-04] [ 4.82066128e-01 9.11999763e-01 0.00000000e+00 2.41399100e-01 2.93302168e-01]] ----- For each node, normalize the edge (or neighbor) contributions using softmax [0.26263543 0.21349717 0.20979916 0.31406823 0.21610715 0.17567419 0.1726313 0.1771592 0.25842816 0.27167844 0.24278118 0.24273876 0.24280162 0.23393014 0.23388927 0.23394984 0.29823075 0.25138555 0.22399017 0.22400903 0.30061525] ----- Normalized edge score matrix. Shape(n,n) [[0.26263543 0.21349717 0.20979916 0. 0.31406823] [0.21610715 0.17567419 0.1726313 0.1771592 0.25842816] [0.27167844 0.24278118 0.24273876 0.24280162 0. ] [0. 0.23393014 0.23388927 0.23394984 0.29823075] [0.25138555 0.22399017 0. 0.22400903 0.30061525]]

স্বাভাবিক এজ স্কোর সংজ্ঞায়িত শেষ ম্যাট্রিক্সের অর্থ ব্যাখ্যা করার জন্য, আসুন সংলগ্ন ম্যাট্রিক্সের বিষয়বস্তু পুনরুদ্ধার করা যাক।

----- Adjacency Matrix (undirected graph). Shape(n,n) [[1 1 1 0 1] [1 1 1 1 1] [1 1 1 1 0] [0 1 1 1 1] [1 1 0 1 1]]

আপনি দেখতে পাচ্ছেন, প্রান্তগুলিকে সংজ্ঞায়িত করার জন্য 1টি মান থাকার পরিবর্তে, আমরা প্রতিটি প্রতিবেশীর অবদানকে পুনরায় স্কেল করেছি। চূড়ান্ত ধাপ হল আশেপাশের সমষ্টি গণনা করা: প্রতিবেশীদের থেকে এম্বেডিংগুলি গন্তব্য নোডে অন্তর্ভুক্ত করা হয়, মনোযোগের স্কোর দ্বারা স্কেল করা হয়।

GAT স্তর (সমীকরণ 4)

NumPy কোড

# equation (4)
print('nnNeighborhood aggregation (GCN) scaled with attention scores (GAT). Shape(n, emb)n')
ND_GAT = A_scaled.dot(z1)
print(ND_GAT)

আউটপুট

Neighborhood aggregation (GCN) scaled with attention scores (GAT). Shape(n, emb) [[-0.02166863 0.15062515 0.08352843] [-0.09390287 0.15866476 0.05716299] [-0.07856777 0.28521023 -0.09286313] [-0.03154513 0.10583032 0.04267501] [-0.07962369 0.19226439 0.069115 ]]

পরবর্তী পদক্ষেপ

ভবিষ্যতের নিবন্ধে, আমি মাল্টি-হেড GAT লেয়ারের পিছনের প্রক্রিয়াগুলি বর্ণনা করব, এবং আমরা লিঙ্ক ভবিষ্যদ্বাণী কাজের জন্য কিছু অ্যাপ্লিকেশন দেখতে পাব।

তথ্যসূত্র

  • কোডের চলমান সংস্করণ নিম্নলিখিত পাওয়া যায় নোটবই. আপনি একটি DGL বাস্তবায়নও পাবেন, যা বাস্তবায়নের সঠিকতা পরীক্ষা করতে কার্যকর।
  • Petar Veličković, Guillem Cucurul, Arantxa Casanova, Adriana Romero, Pietro Liò, Yoshua Bengiois-এর থেকে গ্রাফ অ্যাটেনশন নেটওয়ার্কের মূল কাগজ এখানে উপলব্ধ নথিপত্র.
  • বিষয়টির গভীর ব্যাখ্যার জন্য, আমি ভিডিওটি থেকেও পরামর্শ দিচ্ছি আলেক্সা গর্ডিক.

এই নিবন্ধটি মূলত উপর প্রকাশ করা হয়েছিল ডেটা সায়েন্সের দিকে এবং লেখকের অনুমতি নিয়ে TOPBOTS এ আবার প্রকাশিত।

এই নিবন্ধটি উপভোগ করবেন? আরও এআই আপডেটের জন্য সাইন আপ করুন।

আমরা আরও প্রযুক্তিগত শিক্ষা ছেড়ে দিলে আমরা আপনাকে জানাব।

সূত্র: https://www.topbots.com/graph-attention-networks-under-the-hood/

সময় স্ট্যাম্প:

থেকে আরো শীর্ষস্থানীয়